我一直在建立这个聊天室,但我陷入了一些我还无法弄清楚的事情。
我一直在尝试根据场景向左或向右对齐相同的 View ,但没有成功,但我还没有得到所需的结果。
基本上,我在界面生成器中构建了单元格并将其固定在左侧,并根据内部标签的内容使其宽度和高度可变。
我一直在尝试做的是重复使用相同的单元格,并在我是发送消息的人(黄色)时向右对齐,因为默认情况下,当其他人向我发送消息时,它会向左对齐(灰色) )请参见下图进行说明:
我想要的是:
其他留言--------
--------------我的留言
为了实现这一目标,在 TroyT 的建议下,我根据需要激活和停用前导/尾随约束。
所以我所做的是。
在我的 UITableViewCell 类上,我为两个约束创建了两个 @IBoulet,如下所示:
@IBOutlet var bubbleViewLeading: NSLayoutConstraint!
@IBOutlet var bubbleViewTrailing: NSLayoutConstraint!
随后,在 tableViewController 的方法 cellForRowAtIndexPAth 中,我根据需要执行以下操作来激活或停用其中一个约束。
cell.bubbleViewTrailing.active = true
cell.bubbleViewLeading.active = false
或者相反
cell.bubbleViewTrailing.active = false
cell.bubbleViewLeading.active = true
其中设置为“True”的约束设置为 0。正如我之前提到的,这对于除第一个单元格之外的所有单元格都有效。
- 这部分有效,因为由于某种原因它不会影响第一行,并且两个约束都保持激活状态,因此该行会拉伸(stretch)到表格 View 的宽度,如下所示:
我尝试了以下几种方法:
- 使用 UITableViewCell 类中的 init 方法更改约束
- 更改 UITableViewCell 中 awakeFromNib 方法的约束
- 使用 Storyboard左侧第三个选项卡上的“用户定义的运行时属性”,添加名为“active”的关键路径,将类型设置为 Bool,并将值设置为 false。
- 当我在 Storyboard中选择约束时,在属性检查器中取消选中“已安装”
但是,这些方法都不会影响第一个单元格的约束,但我可以轻松更改其他所有内容,例如单元格背景或单元格内标签中的文本对齐方式。这只是我第一次使用单元时不会改变的约束。即使当我向下滚动越过屏幕边界以“强制”单元格重用时,第一个单元格也会被固定:
我几天来一直试图解决这个问题,但收效甚微。因此,我决定对这个问题悬赏。
最佳答案
你解释的对我来说没有什么意义,但如果它只发生在第一行,那么我会尝试通过执行以下操作来强制布局重绘:
cell.setNeedsLayout()
cell.layoutIfNeeded()
来自cellForRowAtIndexPath
顺便说一句,我认为更好的方法是注册 2 个不同的单元格,并在 IB 中创建它们。这种方法将使您的代码更短,并且允许您不仅修改尾随/前导,还可以修改颜色、字体或任何您需要的内容。您为它们提供 2 个不同的 ID,但保留相同的实现类,然后只需将 cellForRowAtIndexPath
上所需的 ID 出队即可。
为每种样式保留不同的单元格是使用 IB 执行这些操作的标准方法。
关于swift - 以编程方式更改 View 以左对齐或右对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36297113/