点击单元格时,UILabel 向右移动

Posted

技术标签:

【中文标题】点击单元格时,UILabel 向右移动【英文标题】:UILabel shifts to the right when cell is tapped 【发布时间】:2018-04-23 12:44:00 【问题描述】:

我有一个 UITableView 并在其中包含单元格,我在其中使用 textLabel 和 detailTextLabel 以及作为公开指示符的附件视图。这些是我的限制。

if (cell.contentView.constraints.count == 0) 
      cell.textLabel?.translatesAutoresizingMaskIntoConstraints = false
      cell.detailTextLabel?.translatesAutoresizingMaskIntoConstraints = false

      let margins = cell.contentView.layoutMarginsGuide

      // TextLabel constraints
      cell.textLabel?.leftAnchor.constraint(equalTo: margins.leftAnchor).isActive = true
      cell.textLabel?.centerYAnchor.constraint(equalTo: margins.centerYAnchor).isActive = true

      // DetailTextLabel constraints
      cell.detailTextLabel?.rightAnchor.constraint(equalTo: margins.rightAnchor, constant: -10).isActive = true
      cell.detailTextLabel?.leftAnchor.constraint(equalTo: (cell.textLabel?.layoutMarginsGuide.rightAnchor)!, constant: 10).isActive = true
      cell.detailTextLabel?.centerYAnchor.constraint(equalTo: margins.centerYAnchor).isActive = true
    

现在,当第一次加载表格视图时,我看到一切正常,即 detailTextLabel 距离 contentView -10 点,但是当我点击单元格时,detailTextLabel 向右移动并拥抱 contentView,就好像 - 10点约束甚至不存在。现在当我再次回到这个 VC 时,我仍然看到 detailTextLabel 拥抱 contentView 即 reloadData 没有任何效果。但是,如果我解雇了这个 VC 并再次回到这里,我的约束和它们应该在的位置,当我点击单元格进入下一个屏幕时问题再次出现。

我的 viewWillAppear 中有一个 reloadData() 调用,它被调用但没有产生任何效果。

我希望我能解释一下自己,我在这里做错了吗?

【问题讨论】:

你能在cellForRowAt中试试cell.contentView.layoutIfNeeded()吗? 检查在 if 语句中设置了多少次约束,每行一次还是被多次调用? 为什么在设置约束之前要检查是否有零约束?有实际需要吗?如果没有看到比发布更多的代码,我强烈怀疑 if 语句是罪魁祸首,删除它会解决问题。 【参考方案1】:

问题是您使用的是内置单元格类型,其中文本标签和详细信息标签是内置的,不属于您。它们属于细胞。单元格在选择时重新定位它们。你在和细胞战斗。

如果您想自定义单元格的外观并更改单元格标签的位置,请使用自定义单元格类型,并为其提供属于您的自定义标签。您可以在故事板设计器中直接给他们约束。根本不要使用内置的文本标签和细节标签。

【讨论】:

谢谢!!这确实是问题所在。现在已经修好了。然而,在实现时我看到了一个奇怪的问题,当我第一次检查 contentView.constraints.count 时它没有给我 0,它应该给我 0,因为我没有添加任何约束。到目前为止,我只有 1 个单元格,但是当我有大量单元格时,每次添加约束都不是很好。是吗??我在哪里错了吗??谢谢!! 不检查任何约束。读我说的话。在情节提要中配置单元格。 我没有使用故事板。我正在以编程方式制作 UI 好的,但是你仍然不检查约束。只需添加子视图并给它们约束或框架,一次。如果子视图已经存在,请不要再次添加。 实际上我在考虑更多的单元格数,比如 100 个,并且在任何时间点都说只能显示 10 个单元格。为每个可见单元格调用我的自定义单元格的 init,我将子视图添加到我的 contentView 添加约束。但是我忘记了这样一个事实,即当用户滚动并说第 11 个单元格出现但当 dequeueReusableCell 在 cellForRowAtIndexPath 中被调用时,系统会尝试重用已设置好的所有内容的队列单元格,并且在这种情况下不会调用 init 因此不添加子视图不再添加约束。我希望我的想法是正确的?谢谢!!【参考方案2】:

如果它不是自定义类型的单元格,则不能更改单元格标签的约束。如果您想要自定义约束,那么您应该创建自己的自定义单元格,该单元格继承自 UITableViewCell 并设置您自己的约束条件。

【讨论】:

与我现有的答案相同。

以上是关于点击单元格时,UILabel 向右移动的主要内容,如果未能解决你的问题,请参考以下文章

当我在 ios 中展开和折叠 TableList 单元格时如何更改 UILabel 文本颜色

包含 UILabel 和 UIButton 的 UICollectionViewCell 无法识别对一半单元格的触摸

选择单元格时 UICollectionView 正在滚动

在 UITableView 中点击已选择的单元格时,将调用 willSelectCellAtIndexPath

为啥在制作自定义表格视图单元格时将可重用单元格出列两次

当UITableViewCell被点击时,UILabel未按预期更新的行数