【问题标题】:iOS Centring UITableViewCell label with disclosure indicator带有披露指示器的 iOS 居中 UITableViewCell 标签
【发布时间】:2025-12-13 20:25:01
【问题描述】:

我正在寻找一种在表格单元格中输入标签的方法,该表格单元格也具有披露指示符。我目前遇到的问题是,在计算标签的位置时似乎忽略了披露指标

这是一张图片:

因此,您可以看到标签位于单元格左侧和指示器左侧之间的区域的中心,如果它位于单元格的中心,它将位于导航栏标题下方。

感谢您的帮助

从故事板中

【问题讨论】:

  • 你不能把标签的宽度扩展到单元格的宽度吗?
  • 不过就是这样,单元格宽度似乎不包括指标
  • 你能从你的故事板而不是模拟器中显示屏幕截图吗? :)
  • 另外,您使用的是自定义的还是默认的UITableViewCell
  • 自定义单元格@nburk 并添加了图片

标签: ios objective-c uitableview constraints


【解决方案1】:

为了不受任何常量的约束,您可以计算framecontentView.frame 的宽度差。所以首先像这样创建一个出口集合:

@property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *centerConstraintsToOffset;

然后将您希望在单元格中水平居中的中心约束添加到该插座集合:

最后将此代码添加到您的单元格中:

override func layoutSubviews() {
    super.layoutSubviews()
    for constraint in centerConstraintsToOffset {
        constraint.constant = (frame.size.width - contentView.frame.size.width) / 2.0
    }
}

这还使您可以灵活地在旅途中添加或移除电池配件,并且您的视图将始终完美居中对齐。即使您完全移除配件。

【讨论】:

  • 解决一个恼人问题的好方法——在运行时获取披露指示器的宽度。
  • 很好的解决方案!
【解决方案2】:

Pavel 的回答为我解决了这个问题。在按照他的回答演示创建 IBOutlet 集合之后,这是他为 Swift 3 编辑的代码示例:

override func layoutSubviews() {
    super.layoutSubviews()
    for constraint: NSLayoutConstraint in self.centerConstraintsToOffset {
        constraint.constant = (frame.size.width - contentView.frame.size.width) / 2.0
    }

}

【讨论】:

    【解决方案3】:

    您已经注意到,添加“UITableViewCellAccessoryDisclosureIndicator”会缩小分配给单元格内容视图的空间。另一个不需要自定义指示器或猜测偏移量的解决方案是以编程方式将 UILabel 添加到单元格的根视图,而不是 contentView。例如:

    @property UILabel *label;
    
    // ...
    
    - (void)layoutSubviews
    {
        [super layoutSubviews];
    
        [self.label removeFromSuperview];
        self.label = [[UILabel alloc] init];
        self.label.text = @"Motorsport";
        [self.label sizeToFit];
        label.center = CGPointMake(self.center.x, self.size.height/2);
        [self addSubview:self.label];
    }
    

    【讨论】:

      【解决方案4】:

      好的,首先解释一下您的问题。它与UITableViewCell结构 有关。对于anatomy,我的意思是你的UITableViewCell 只是另一个容器容器,即contentView(你也可以在你的故事板中看到这个)。

      当您在 Storyboards 中操作时,您仅在 contentView 上操作,而不是在实际的 UITableViewCell 上操作。因此,当您使用 AutoLayoutUILabel 设置为 以 X 轴为中心 时,AutoLayout 将始终尝试将其置于contentView,不在外部容器中(即UITableViewCell)。然后,当您向 UITableViewCell 添加 披露指示符 时,contentView 的宽度会自动缩小,因为单元格为披露指示符腾出了空间并希望阻止您在其中添加 UI 元素为披露指标保留的右侧区域。

      现在,您有几个选择:

      1. 您可以直接编辑约束并向其添加一个常量(该值必须与您移除指示器时标签移动的值相同)

      1. 不要使用默认的披露指示符(即不要勾选 Storyboards 中的复选框),只需添加一个带有相同图像的 UIImageView

      【讨论】:

      • 感谢您的解释,使用选项 1 时,显示指示符会一直占用 32 像素吗?
      • 在 iOS 8 上是 34 像素。 Apple 也可以更改此值,因此这不是一个非常可持续的解决方案。
      • 同意@DanielG!依赖这个常量可能不是最好的主意...可以做的一件事是计算这个值,然后在代码中为约束设置常量(例如在viewWillAppear 中) .
      • 请看下面我的回答,我正在计算 self.frame 和 self.contentView.frame 之间的差异