7

我添加了一个 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....

我该怎么办?关于如何使其以通常的方式工作的任何建议,而无需在单元格中添加标签或其他内容?

4

6 回答 6

19

对于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;
}
于 2012-06-16T10:48:42.643 回答
2

字幕样式的问题在于它在布局时会执行 [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,因此会经常调用它,因此会产生性能成本。

于 2013-05-07T21:53:30.350 回答
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;

}

于 2012-06-16T14:55:41.643 回答
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;        
        }
    }
于 2014-06-23T13:25:55.057 回答
0

无法 在 cellForRowAtIndexPath: 方法中更改UITableViewCell中textLabeldetailTextLabel的框架。

如果您不想对您的单元进行子类化,您可以使用

performSelector:withObject:afterDelay:

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

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

在此处查看详细信息

于 2014-07-19T14:55:40.073 回答
0

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

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

改成

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

它会正常工作。

于 2014-07-24T11:59:29.210 回答