【问题标题】:UITableViewCell textLabel offsetUITableViewCell textLabel 偏移量
【发布时间】:2011-04-14 06:59:27
【问题描述】:

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

【问题讨论】:

  • 您可以做的一个简单的事情是在文本前添加几个空格。也许这可以帮助你

标签: iphone objective-c uitableview


【解决方案1】:

您可以使用cell.indentationLevelcell.indentationWidth,而不是为此自定义 UITableViewCell。

【讨论】:

  • 这是最佳答案,为什么不将其标记为解决方案?这正是那家伙所要求的。
  • 香草细胞的最佳解决方案。
  • Amount of indentation = cell.indentationLevel (default 0) * cell.indentationWidth (default 10.0 points)。仅供参考。
【解决方案2】:

你可以试试这个:

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

【讨论】:

  • 您应该在单元格的 contentView 中添加子视图,而不是直接在单元格本身中。
  • 这并不好用,因为它掩盖了 textLabel.text
  • 虽然这个解决方案想法不错(添加自定义标签),但代码示例不是很好。首先,@Mike Weller 是正确的,应该将子视图添加到cell.contentView。其次,应该在if (cell == nil) 检查中添加新标签,这样您就不会将标签添加到已经拥有它们的出列单元格实例中。在标签上设置标签,以便在获取单元格后检索它,以便设置文本。
  • @XJones:谢谢你的建议!!
  • 你不应该讨论代码而不是讨论人,就像你对 Mike Weller 所做的那样。如果他的观点无效,请讨论他的评论。
【解决方案3】:

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

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

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

[编辑 1/2:使用 CGRect 修复错字]

[编辑 3:修正错字设置修改框架]

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

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

按照我上面说的做,但是创建一个UITableViewCell 的(简单)子类,在layoutSubviews 中添加xOffset。如果这样做,您还可以添加一个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,但这就是重点。您将不再使用内置标签,而是使用自定义标签。

【讨论】:

  • 你是说 UIRectFrame 吗?没有CGRectFrame
  • 快,打字太快了。表示CGRect。
  • 是的,但这真的没什么大不了的。子类化对象非常普遍和容易。这也是一个非常简单的子类。
【解决方案4】:

我不是为了投票,而是想展示@iPhone Monster 提供的代码“应该”是什么样子。他的解决方案是一个有效的选择。如果您像他一样将标签添加到 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;
}

【讨论】:

  • true... 但是我想在方法 didSelectRowAtIndexPath 中使用存储在此标签上的文本的值,我想这不可能吗?
  • 您可以像我在这里一样访问标签。在您可以访问单元格的任何地方,您都可以使用[cell.contentView viewWIthTag:OffsetLabelTag] 访问自定义标签。我还会考虑您是否真的需要从此处的标签中获取值。如果可能,最好从数据模型中获取所需的任何值。
【解决方案5】:

您可以使用自动布局做到这一点:

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)];

【讨论】:

  • 这是一个非常简洁的解决方案,最初似乎可以工作。但是,我发现当您滚动时,缩进似乎消失了,因为单元格消失了,然后又重新出现
  • @andygeers 似乎您缺乏其他限制。一旦你定义了.translatesAutoresizingMaskIntoConstraints = NO;,你就有责任放置所有必要的约束,因此视图位置将为自动布局系统很好地定义。在这种情况下,您还需要指定垂直约束。
【解决方案6】:

其他方式:


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

【讨论】:

    【解决方案7】:

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

    【讨论】:

      【解决方案8】:

      基于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
      }
      

      【讨论】:

        【解决方案9】:

        cell.textLabel.textAlignment = UITextAlignmentCenter; 对你来说足够了吗?它可以将文本与中心对齐,为您创造空间

        【讨论】:

        • 它太居中了...我希望它更靠左...就像一个标签
        • 自定义单元格可以工作,但您可以尝试将标签添加到单元格的视图中。您可以调整此标签的框架。
        • 创建 UILabel 并通过 [cell.contentView addSubview:yourLabel] 将其添加到单元格的视图中;
        猜你喜欢
        • 2016-01-02
        • 2011-01-16
        • 1970-01-01
        • 2017-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多