我的视图可以处于几种状态,比如 .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)
])
}
}
所以,我需要保持活动的中心约束将放在容器视图上,并且永远不会被移除。
你认为有更好的方法来实现这个结果吗?或者你对这种方法有什么直接的问题吗?
disabledView
和enabledView
时,将两者作为"main"视图的子视图添加,设置约束,然后隐藏/显示适当的视图即可。 - DonMag