iOS - UITableViewCell文本对齐

时间:2012-06-16 10:40:54

标签: ios uitableview text-alignment

我添加了一个tableView并将一个表格视图单元格拖入其中。 在实用工具面板中,我将样式更改为副标题。 我也尝试在代码中更改它:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }

    cell.textLabel.textAlignment = UITextAlignmentCenter;
    cell.detailTextLabel.textAlignment = UITextAlignmentCenter;

    cell.textLabel.text = [myArray objectAtIndex:indexPath.row];
    cell.detailTextLabel.text = [myArray2 objectAtIndex:indexPath.row];

    return cell;

中心对齐不起作用!

我尝试在单元格中添加标签对象以获得解决方法。但我不知道如何访问它。即使我为它指定了一个插座,这也行不通:

cell.labelForCell....

我该怎么办? 有关如何使其按常规方式工作的任何建议,而不向单元格添加标签或其他什么?

6 个答案:

答案 0 :(得分:18)

对于UITableViewCellStyleSubtitle文本对齐无法更改 你必须放一个标签并添加你的对齐方式, 为此,您可以使用此代码

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    UILabel *myLabel;
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

        myLabel = [[UILabel alloc] initWithFrame:Your_Frame];
        //Add a tag to it in order to find it later
        myLabel.tag = 111;
        //Align it
        myLabel.textAlignment= UITextAlignmentCenter;

        [cell.contentView addSubview:myLabel];
    }

    myLabel = (UILabel*)[cell.contentView viewWithTag:111];
    //Add text to it
    myLabel.text = [myArray objectAtIndex:indexPath.row];

    return cell;
}

答案 1 :(得分:1)

字幕样式的问题在于它在布局时会执行[self.textLabel sizeToFit]。当您居中于容器内容的完美尺寸时,没有任何变化。

试试这个。在UITableViewCell的子类中,设置textAlignment,并将其用作layoutSubviews代码:

- (void)layoutSubviews
{
    [super layoutSubviews];

    {
        CGRect frame = self.textLabel.frame;
        frame.size.width = CGRectGetWidth(self.frame);
        frame.origin.x = 0.0;
        self.textLabel.frame = frame;
    }

    {
        CGRect frame = self.detailTextLabel.frame;
        frame.size.width = CGRectGetWidth(self.frame);
        frame.origin.x = 0.0;
        self.detailTextLabel.frame = frame;
    }
}

这使textLabel的框架全宽,从而使居中效果更加明显。

注意:由于这会覆盖layoutSubviews,因此会产生性能成本,因为它会经常调用。

答案 2 :(得分:1)

您好,请添加以下内容而不是您的代码,

cell.textLabel.textAlignment = UITextAlignmentCenter;
cell.detailTextLabel.textAlignment = UITextAlignmentCenter;

更改为

cell.textLabel.textAlignment = NSTextAlignmentCenter;
cell.detailTextLabel.textAlignment = NSTextAlignmentCenter;

它会正常工作。

答案 3 :(得分:0)

我认为原因是:textLabel的宽度取决于文本长度,如果文本太长而无法在信号行中显示全部,并且您已经设置了换行模式并将行数设置为0 ,你会发现文本对齐将起作用。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     static NSString *identifier = @"identifier";
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if (nil == cell)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier] autorelease];
        cell.textLabel.textAlignment = UITextAlignmentLeft;
        cell.textLabel.textColor = [UIColor redColor];
        cell.detailTextLabel.textColor = [UIColor greenColor];
        cell.detailTextLabel.textAlignment = UITextAlignmentCenter;
        cell.textLabel.lineBreakMode = UILineBreakModeTailTruncation;
        cell.textLabel.numberOfLines = 0;
    }
    cell.textLabel.text = [NSString stringWithFormat:@"You can initialize a very long string for the textLabel, or you can set the font to be a large number to make sure that the text cann't be shown in a singal line totally:%d", indexPath.row];
    return cell;

}

答案 4 :(得分:0)

我认为调整框架会起作用。我有UITableViewCellStyleValue2的样式但是如果我在textLabel中有一个有点冗长的文本,它会在尾部被截断而textAlignment在这里不起作用,所以想到增加textLabel的宽度。

 -(void)layoutSubviews{
        [super layoutSubviews];

        if ([self.reuseIdentifier isEqualToString:@"FooterCell"]) {
            CGRect aTframe  = self.textLabel.frame;
            aTframe.size.width += 40;
            self.textLabel.frame = aTframe;

            CGRect adTframe  = self.detailTextLabel.frame;
            adTframe.origin.x += 70;
            self.detailTextLabel.frame = adTframe;        
        }
    }

答案 5 :(得分:0)

UITableViewCell 中更改 textLabel detailTextLabel 的框架是不可能的 在cellForRowAtIndexPath:方法中。

如果您不想将您的单元格子类化,则可以使用

实现小型黑客攻击
performSelector:withObject:afterDelay:

默认layoutSubviews 之后立即更改几何图形的延迟为零:

[self performSelector:@selector(alignText:) withObject:cell afterDelay:0.0];

详情请见here