点击单元格时,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 无法识别对一半单元格的触摸