以编程方式更改约束仅影响视图的可见部分

时间:2015-07-25 17:34:31

标签: ios swift autolayout

我在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处于横向模式时会发生这种情况。几个例子:

这是它在默认模式下的外观(由IB设置): enter image description here

当我按下编辑时,所有三个文本框都可见(正确的layoutet): enter image description here

当我在向下滚动之前按下编辑时(碳水化合物不可见),这就是它在风景中的外观。当我按Done并再次编辑时,一切都正确,因为所有文本框都是可见的: enter image description here

1 个答案:

答案 0 :(得分:0)

我自己解决了。显然,您应该只更改视图控制器的viewDidLayoutSubviews()方法中的约束。我以这种方式更改了代码:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    setContraintsEditing(editing)
}

override func setEditing(editing: Bool, animated: Bool) {
    super.setEditing(editing, animated: animated)

    if (animated) {
        view.layoutIfNeeded()
        UIView.animateWithDuration(1.0) { () -> Void in
            self.setControlsEditing(editing)
            self.view.layoutIfNeeded()
        }
    } else {
        setControlsEditing(editing)
    }
}

如您所见,现在从正确的位置调用setContraintsEditing(bool)方法,动画块由layoutIfNeeded()间接调用。