用另一个UIView替换UIView,保持约束不变

4

我的视图可以处于几种状态,比如 .enabled.disabled。除了它们的内容都居中显示外,禁用和启用的视图大不相同。

在运行时,条件可能会改变,因此视图应相应更新。换句话说,我可能想要删除禁用视图并添加启用视图。

是否有可能在不添加新约束的情况下更新子视图?

使用一个容器视图我解决了这个问题;

private var containerView: UIView = {
    let containerView = UIView()
    containerView.translatesAutoresizingMaskIntoConstraints = false

    return containerView
}()

我以传统的方式添加到视图中

addSubview(containerView)

设置约束条件;

NSLayoutConstraint.activate([
    containerView.centerYAnchor.constraint(equalTo: .centerYAnchor)
    containerView.leadingAnchor.constraint(equalTo: .leadingAnchor),
    containerView.trailingAnchor.constraint(equalTo: .trailingAnchor)
])

然后,当我想切换视图时,我会做类似这样的事情:

    var state: ViewState? {
        didSet {
            guard let state = state else { return }

            // Remove previously added view
            containerView.subviews.forEach({ $0.removeFromSuperview() })

            var contentView: UIView

            switch state {
            case .disabled:
                contentView = disabledView
            case .enabled:
                contentView = enabledView
            }

            containerView.addSubview(contentView)

            NSLayoutConstraint.activate([
                contentView.topAnchor.constraint(equalTo: containerView.topAnchor),
                contentView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor),
                contentView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor),
                contentView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor)
            ])
        }
    }

所以,我需要保持活动的中心约束将放在容器视图上,并且永远不会被移除。

你认为有更好的方法来实现这个结果吗?或者你对这种方法有什么直接的问题吗?


3
这种方法本质上没有什么问题。如果你想要另一种方法...在实例化disabledViewenabledView时,将两者作为"main"视图的子视图添加,设置约束,然后隐藏/显示适当的视图即可。 - DonMag
1个回答

1

但这是否意味着disabled状态是一个子视图控制器,而enabled则是另一个子视图控制器? - sch
在 childViewController 中保留启用的控制器。禁用的控制器将从 childViewController 中移除。 - Mitesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接