繁体   English   中英

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

[英]Changing constraints programmatically only affects visible parts of the view

我在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设置)下的外观: 在此处输入图片说明

当我在三个文本框都可见的情况下按“编辑”(正确的布局): 在此处输入图片说明

这是我在向下滚动之前按编辑键时所看到的风景(碳水化合物不可见)。 当我按“完成”并再次单击“编辑”时,由于所有文本框均可见,因此一切正确: 在此处输入图片说明

我自己解决了。 显然,您只应在视图控制器的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()间接调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM