【问题标题】:UITableViewCell bottom margin constraintUITableViewCell 底部边距约束
【发布时间】:2017-05-15 03:23:11
【问题描述】:

我有以下 UITableViewCell ,其中基于条件 redView.heightConstraint.constant = 0 ,这工作正常。

但底部的空间原来是a+b = 20,其中

a = 10   between green an red view
b = 10   between red and bottom of the superview

redView的高度设置为0时的预期底部空间应该是10。当redView的高度设置为0时,我应该如何设置约束以达到预期的底部边距10 ?

【问题讨论】:

  • 红色和绿色视图之间是否有垂直间距限制?当您将红色视图的高度设置为 0 时,您是否也尝试将其设置为 0?或者您可以尝试在调整高度时将红色视图的底部空间约束设置为 0。
  • 我可以为它创建一个出口。但是如果条件满足,我将不得不将值设置为 10,如果不满足,则必须将值设置为 0。但为此,我必须声明一个常量并将值设置为 10。但正在寻找一种更动态的方法。
  • 是的,我总是发现更改约束有点笨拙。我不确定有没有更好的方法:/

标签: ios xcode uitableview autolayout


【解决方案1】:

更改红色视图的高度不会改变其相对于超级视图底部的位置,因此绿色视图首先在该视图顶部有一个10 pix 边距,另外还有一个10 pix 到超级视图的底部。

选项 1:更改 2 个约束

  1. redView.heightConstraint.constant = 0
  2. redView.bottomConstraint.constant = 0

把这两个变化一起做,红色的view会在它的superview底部有效的变成一个零高度的view;绿色视图也会效仿。

选项 2:将红色视图嵌入到不可见的占位符中

  • placeholder.heightConstraint.constant = 0

占位符(灰色矩形)锚定在超级视图的底部;它包含红色视图及其垂直间隔。蓝色视图不再与红色视图的顶部隔开,而是与其占位符的顶部隔开。此解决方案涉及的代码行数更少,而换取了稍微复杂的资源。


无论哪种方式,您都可以在首次加载视图时存储 Storyboard 资源 constant 以避免硬编码:

// At the class level
let originalHeight = someView.heightConstraint.constant

// At the method level, toggle
someView.heightConstraint.constant = (fullHeight) ? originalHeight : 0

【讨论】:

  • 选项 2 效果很好。在选项 1 中,当条件为真时,我必须设置 redView.bottomConstraint.constant = 0,当条件为假时,我必须设置 redView.bottomConstraint.constant = CONSTANT,这个常量我必须从代​​码中设置,所以如果我改变Storyboard 中的间距从 10 到 12,我将不得不在代码中进行更新。
  • 您是对的:通过引入更多代码,您会引入更多复杂性,并且可能会引入更多错误。不过,在 #1 或 #2 中,您都不需要硬编码:您可以在加载时读取资源 constant 高度值,存储它并使用它来恢复
  • 我也更喜欢#2,因为它的代码更少,因此中断的地方更少。我添加了一条关于如何不对constant 进行硬编码的注释。
  • 这是一个很好的说明。我正在考虑创建一个 var 并在 nib 唤醒时初始化该常量。但在班级级别添加它是个好点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多