【发布时间】:2015-07-25 17:34:31
【问题描述】:
我在 Interface Builder 中用两组约束构建了一个带有静态单元格的 TableView。一个用于编辑视图,一个仅用于查看。不仅仅是改变三个文本框的位置。
第一组约束在界面构建器中被激活,第二组被停用(“已安装”未被选中)。
然后,当用户首先单击“编辑”时,旧约束被停用,而其他约束被激活:
@IBOutlet var nonEditableConstraints: [NSLayoutConstraint]!
@IBOutlet var editableConstraints: [NSLayoutConstraint]!
override func setEditing(editing: Bool, animated: Bool) {
super.setEditing(editing, animated: animated)
view.layoutIfNeeded()
if (animated) {
UIView.animateWithDuration(1.0) { () -> Void in
self.setControlsEditing(editing)
self.setContraintsEditing(editing)
self.view.layoutIfNeeded()
}
} else {
setControlsEditing(editing)
setContraintsEditing(editing)
}
}
private func setContraintsEditing(editing: Bool) {
// we need to make sure to deakcivate constraints before activating new ones
if (editing) {
for constraint in nonEditableConstraints {
constraint.active = false
}
for constraint in editableConstraints {
constraint.active = true
}
} else {
for constraint in editableConstraints {
constraint.active = false
}
for constraint in nonEditableConstraints {
constraint.active = true
}
}
}
这很好用。唯一的问题是,当约束发生变化时,只要三个“宏观营养”字段中的一部分受到约束更改不可见,它们就会保持默认状态(IB 设置的状态)。当 iPhone 处于横向模式时会发生这种情况。几个例子:
这是我在向下滚动之前按下编辑时它在横向中的样子(碳水化合物不可见)。当我按完成并再次编辑时,一切都是正确的,因为所有文本框都是可见的:
【问题讨论】:
-
您是否尝试在受影响的视图上调用
setNeedsLayout?此外,您不应该在动画条件之外调用view.layoutIfNeeded(),如果您不制作动画,您应该通过setNeedsLayout将布局标记为脏,并让后续布局通过处理它。简而言之,您通常只需要为动画(或交互式布局中使用的更高级的离屏布局)调用layoutIfNeeded
标签: ios swift autolayout