UITableViewCell textLabel偏移量

时间:2011-04-14 06:59:28

标签: iphone objective-c uitableview

我希望我的UITableViewCell中的文本有点偏右。换句话说,我想要一个x偏移量。这甚至可能吗?我是否因此而需要创建自定义单元格?

9 个答案:

答案 0 :(得分:107)

您可以使用cell.indentationLevel,如果需要cell.indentationWidth而不是自定义UITableViewCell。

答案 1 :(得分:31)

你可以试试这个:

[cell setIndentationLevel:SOME_NUMBER];
[cell setIndentationWidth:SOME_OTHER_NUMBER];

答案 2 :(得分:11)

一个简单的解决方案是你可以改变textLabel的框架。

CGRect textLabelFrame = cell.textLabel.frame;
textLabelFrame.origin.x += xOffset;
textLabelFrame.size.width -= xOffset;
cell.textLabel.frame = textLabelFrame;

我也是通过创建一个支持类似于UIButton的edgeInsets的自定义UILabel来完成的。这是一个更好的解决方案b / c您可以将标签布局为正确的尺寸,但如果您有简单的需求,上述方法将有效。

[编辑1/2:修正错字与CGRect]

[编辑3:固定拼写错误设置修改框架]

[编辑4:需要一个简单的子类]

Mea culpa。我错了,您可以在tableView:cellForRowAtIndexPath中执行此操作。在tableView委托/数据源有机会自定义单元格之后,UITableViewCell布局发生。我已经测试了下面的实现,它可以工作。

如上所述,但创建一个UITableViewCell的(简单)子类,在xOffset中添加layoutSubviews。如果您这样做,您还可以添加xOffset属性,您可以在tableView:cellForRowAtIndexPath:中设置该属性。

@implementation XOffsetCell
// assumes property xOffset is defined and synthesized
- (void) layoutSubviews
{
    [super layoutSubviews];
    CGRect textLabelFrame = cell.textLabel.frame;
    textLabelFrame.origin.x += self.xOffset;
    textLabelFrame.size.width -= self.xOffset;
    cell.textLabel.frame = textLabelFrame;
}
@end

建议向UILabel添加自定义cell.contentView的解决方案也是一个很好的解决方案。我看到你的评论它掩盖了内置的textLabel,但这就是重点。您不再使用内置标签,而是使用自定义标签。

答案 3 :(得分:5)

我不是为了投票,而是想表明@iPhone怪物提供的代码应该是什么样子。他的解决方案是有效的选择。如果您在if (cell == nil)之后将标签添加到单元格中,那么您将不断向出列单元格添加标签。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
        UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(50.0f, 10.0f, 150.0f, 20.0f)];
        lbl.tag = OffsetLabelTag; // define this as a constant
        [cell.contentView addSubview:lbl];
        [lbl release];
    }

    UILabel *lbl = (UILabel *)[cell.contentView viewWithTag:OffsetLabelTag];
    [lbl setText:@"test text"];

    return cell;
}

答案 4 :(得分:4)

您可以使用Autolayouts执行此操作:

UITableViewCell* cell = [UITableViewCell new];
cell.textLabel.translatesAutoresizingMaskIntoConstraints = NO;
[cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(indentation)-[textLabel]-(indentation)-|"
                                                                         options:0
                                                                         metrics:@{@"indentation": @35}
                                                                           views:@{@"textLabel": cell.textLabel}]];

或使用Parus lib

[cell.contentView addConstraints:(PVVFL(@"H:|-(indentation)-[textLabel]-(indentation)-|")
                                  .withViews(@{@"textLabel": textLabel})
                                  .metrics(@{@"indentation": @35}).asArray)];

答案 5 :(得分:3)

其他方式:


    -(NSInteger)tableView:(UITableView *)tableView 
                indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return intOffset;  // but is like '\t', not points
    }

答案 6 :(得分:0)

还有另一种不太漂亮和聪明的方法:)TableViewCell中Label的位置取决于分配给cell.imageView.image属性的图像大小。因此,如果您希望文本向右移动,则可以在单元格中添加几个空白像素列。

答案 7 :(得分:0)

基于 https://stackoverflow.com/a/5659826/1058199,这是一个 Swift 版本。

这在单元格内仅用于将 textLabel 向右移动。斯威夫特 5.4

override func layoutSubviews() {
    super.layoutSubviews()
    var textLabelFrame = self.textLabel?.frame
    textLabelFrame?.origin.x += 32
    textLabelFrame?.size.width -= 32
    self.textLabel?.frame = textLabelFrame ?? CGRect.zero
}

答案 8 :(得分:-4)

cell.textLabel.textAlignment = UITextAlignmentCenter;对您来说是否足够。它可以将文本与中心对齐,为您创建空间