UITableViewCellAccessoryCheckmark 和 AutoLayout 约束

20

我有自定义的UITableViewCell并管理我的单元格选择。当选中单元格并显示出勾选标记时,单元格的Content View宽度会缩小,我的带有约束的标签也会向左移动。如何有效避免内容移动?

我不想将约束设置为leading,因为我有灵活的tableview宽度,并且它们是右对齐的。当我想通过IBOutlets在代码中更新标签的约束时,我遇到了问题,因为在cellForRow:中返回了多个子类的UITableViewCell,在didSelectRowAtIndexPath:中尝试在代码中设置约束时出现了未识别的选择器错误。是否有优雅的解决方案?谢谢。

图片描述

图片描述

3个回答

31

我曾经遇到过与此类似的问题(确切地说就是这个问题),勾选框会把所有东西都往左边推。

- 编辑:

在我最初的回答几个小时后,我意识到这是一个非常简单的问题。

这种向左的推动是将单元格的contentView约束推向左侧。那么怎么办呢?

将右侧项目(如按钮)的约束从cell本身连接到它,而不是它的contentView上。

将约束连接到单元格视图



- 原始回答(实际答案在前面,这只是记录):

我刚刚意识到有一个非常简单的解决方案。当选择框被打开时,我的按钮会被向左推移,我必须保持一个约束来使其保持在原地(这样“取消选择”就不会将按钮向右移动)。它是从右侧硬编码的“宽度”,总体来说,这是不好的做法。更不用说我无法动态地获取那个勾选框“宽度”。

解决方案?

从左侧保持一个约束。

就是这样。我还有一个标签,所以在我的情况下:从按钮左侧到标签的约束(这样它们不会重叠)和从按钮左侧到左侧内容视图的约束。基本上,任何右侧移动的元素都不能真正“到达”左侧(而是让所有东西都“坐”在右侧)。

带有约束的单元格


1
两个好答案,而且比被采纳的解决方案简单多了! - Chris Nolet
2
这在Xcode 9,Swift 4,iOS 9.3上不起作用。自动布局会抱怨并破坏约束。实际上,它应该这样做。基本问题是这是苹果的设计缺陷:UITableViewCell很糟糕,就像UITableView一样。它已经十年了,准备被淘汰。 - Womble
1
最近在这里(Xcode 9.2)又使用了这个设置,它仍然有效。如果有约束问题,可能是因为之前的约束与其冲突。 - bauerMusic

11

这是设计上的行为。

获取想要的行为最简单的方法是在每个单元格上设置一个空的附件视图,这将使所有内容向左移动与选中标记相同的距离。


4
请注意,accessoryView 优先于 accessoryType。如果您有一个非空的 accessoryView,则 accessoryType 将不会显示。 - CrimsonChris
1
当在 iPhone Xs 模拟器上运行此代码(12.4),空的 UIView 导致附加视图偏移几个像素,这会在显示/隐藏勾选标记时产生轻微间隙。使用这种解决方案,使其正常工作的唯一方法是使用与勾选标记按钮相同的宽度,这并不是一个非常灵活的解决方案。 - bcause
这种方法的挑战在于确定什么距离是“与苹果内置的UITableViewCellAccessoryCheckmark相同的距离”。 - George WS
George,一个空的附属视图将插入与复选标记相同的量。至少在2014年是这样的。 - CrimsonChris

2
把复选标记一直放在那里,然后调整透明度/透明度怎么样?最初的回答。
    if checked
    {
        cell.accessoryType = .checkmark
        cell.tintColor = cell.tintColor.withAlphaComponent(1)
    }
    else
    {
        cell.accessoryType = .checkmark
        cell.tintColor = cell.tintColor.withAlphaComponent(0)
    }

好主意。但如果您正在使用外观代理,则无法正常工作。例如,UIButton.appereance().tintColor = .red 将导致 cell.tintColor 被忽略。 - bcause
但是如果您没有使用外观代理(),这将非常有效! - George WS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接