【发布时间】:2019-08-01 14:16:32
【问题描述】:
在最新的 Xcode (10.1) 上,我无法使用编程约束向我的 UIStackView 添加固定大小的 UIView。我认为这应该很简单,但我不明白额外的约束来自哪里(UIKit 必须打破一些来布局视图)。
问题是我期待一个 100x100 的蓝色 UIView。现实情况是,蓝色 UIView 是 100% 屏幕宽度和 100% 屏幕高度。
我意识到 UIStackView 使用 intrinsicContentSize,但是如何使用编程约束正确设置它?
以下是添加了 UIStackView 和原版 UIView 的工作游乐场。
注意:如果我将蓝色 UIView 直接添加到 ViewController 的 view,则大小在原点 (0,0) 处的 100x100 处是正确的。将其添加到堆栈视图会导致约束冲突。
import UIKit
import PlaygroundSupport
class MyViewController : UIViewController {
override func loadView() {
let view = UIView()
view.backgroundColor = .white
self.view = view
// vertical stack view (full screen)
let stackView = UIStackView()
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.axis = .vertical
view.addSubview(stackView)
NSLayoutConstraint.activate([
stackView.topAnchor.constraint(equalTo: view.topAnchor),
stackView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
stackView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
stackView.widthAnchor.constraint(equalTo: view.widthAnchor),
])
// view (100x100)
let fixedSizeView = UIView()
fixedSizeView.translatesAutoresizingMaskIntoConstraints = false
fixedSizeView.backgroundColor = .blue
stackView.addArrangedSubview(fixedSizeView)
NSLayoutConstraint.activate([
fixedSizeView.widthAnchor.constraint(equalToConstant: 100),
fixedSizeView.heightAnchor.constraint(equalToConstant: 100),
])
}
}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()
【问题讨论】:
-
根据您的要求使用 StackView 的对齐方式可能对您有用。
-
我已经尝试过了,但这并没有解决问题。如果您可以提供解决问题的答案(对 Swift Playground 示例的代码修改),我很乐意将其标记为解决方案
-
内部只有一个
UIView,为什么还要使用UIStackView?只需将fixedSizeView直接添加到视图即可。 -
见下面的评论/答案。我计划添加几个子视图。作为开发代码的一部分,我首先添加了 1 个视图。在那之后,我正在添加更多的子视图。