【发布时间】:2018-11-02 20:54:57
【问题描述】:
我有一个UIStackView,它根据其宽度改变轴。它仅包括两个UViews。有一个非常简单的设置(可以复制/粘贴到默认的 Xcode 项目):
class ViewController: UIViewController {
enum DisplayMode {
case regular
case compact
}
private let stackView = UIStackView(frame: .zero)
private let firstView = UIView(frame: .zero)
private let secondView = UIView(frame: .zero)
private var firstViewWidth: NSLayoutConstraint?
private var secondViewWidth: NSLayoutConstraint?
override func viewDidLoad() {
super.viewDidLoad()
stackView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(stackView)
NSLayoutConstraint.activate([
stackView.topAnchor.constraint(equalTo: view.topAnchor),
stackView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
stackView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
])
firstView.backgroundColor = .red
stackView.addArrangedSubview(firstView)
firstView.heightAnchor.constraint(equalToConstant: 80).isActive = true
firstViewWidth = firstView.widthAnchor.constraint(equalTo: stackView.widthAnchor, multiplier: 1/3)
firstViewWidth?.isActive = true
secondView.backgroundColor = .black
stackView.addArrangedSubview(secondView)
secondView.heightAnchor.constraint(equalToConstant: 80).isActive = true
secondViewWidth = secondView.widthAnchor.constraint(equalTo: stackView.widthAnchor, multiplier: 2/3)
secondViewWidth?.isActive = true
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if view.bounds.width < 400 {
switchMode(.compact)
} else {
switchMode(.regular)
}
}
}
private extension ViewController {
func switchMode(_ mode: DisplayMode) {
switch mode {
case .regular:
stackView.axis = .horizontal
firstViewWidth?.isActive = true
secondViewWidth?.isActive = true
case .compact:
stackView.axis = .vertical
firstViewWidth?.isActive = false
secondViewWidth?.isActive = false
}
}
}
它工作得很好,但它给了我无意义的布局错误(输出中的所有约束似乎都很好),同时从紧凑更改为常规:
(
"<NSLayoutConstraint:0x6000002c1c20 UIView:0x7fbd4dc149a0.width == 0.333333*UIStackView:0x7fbd4df02430.width (active)>",
"<NSLayoutConstraint:0x6000002c2170 UIView:0x7fbd4dc14d90.width == 0.666667*UIStackView:0x7fbd4df02430.width (active)>",
"<NSLayoutConstraint:0x6000002f2080 'UISV-canvas-connection' UIStackView:0x7fbd4df02430.leading == UIView:0x7fbd4dc149a0.leading (active)>",
"<NSLayoutConstraint:0x6000002f1c70 'UISV-canvas-connection' H:[UIView:0x7fbd4dc14d90]-(0)-| (active, names: '|':UIStackView:0x7fbd4df02430 )>",
"<NSLayoutConstraint:0x6000002f05f0 'UISV-spacing' H:[UIView:0x7fbd4dc149a0]-(0)-[UIView:0x7fbd4dc14d90] (active)>"
)
有人可以解释为什么会这样吗?动态轴是罪魁祸首吗?
【问题讨论】:
标签: ios autolayout uistackview