由于自iOS7以来的大量更新,我想问这个问题是因为我对自动布局和新的stackview的经验有限,我想知道在Objective-C中实现以下内容的最佳设计实践是什么(不是很快):
在我看来,有一个容器滚动视图,带有子容器UIView。在这个UIView中,有许多元素。其中一个元素是一堆UIViews,它们的数量偶尔会有所不同。
此元素后跟地图和其他视图。
问题
因此,您可能希望将整个布局包含在stackview中。只是需要考虑的事情。
要调整stackview中元素的大小,必须在它们上设置水平约束。然后,您可以在代码中修改该单个水平约束以更改对象的高度。
或者在界面构建器中,只需将元素拖到堆栈视图中即可。确保它具有该水平约束,否则它将调整大小。
Swift 4.2
如果你想使用代码而不是故事板,我创建一个使用自动布局的例子,不需要估计内容的大小。
你只需要添加到堆栈视图或从中删除并自动滚动高度修改。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(scrollView)
scrollView.addSubview(scrollViewContainer)
scrollViewContainer.addArrangedSubview(redView)
scrollViewContainer.addArrangedSubview(blueView)
scrollViewContainer.addArrangedSubview(greenView)
scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
scrollViewContainer.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
scrollViewContainer.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
scrollViewContainer.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
scrollViewContainer.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
// this is important for scrolling
scrollViewContainer.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true
}
let scrollView: UIScrollView = {
let scrollView = UIScrollView()
scrollView.translatesAutoresizingMaskIntoConstraints = false
return scrollView
}()
let scrollViewContainer: UIStackView = {
let view = UIStackView()
view.axis = .vertical
view.spacing = 10
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
let redView: UIView = {
let view = UIView()
view.heightAnchor.constraint(equalToConstant: 500).isActive = true
view.backgroundColor = .red
return view
}()
let blueView: UIView = {
let view = UIView()
view.heightAnchor.constraint(equalToConstant: 200).isActive = true
view.backgroundColor = .blue
return view
}()
let greenView: UIView = {
let view = UIView()
view.heightAnchor.constraint(equalToConstant: 1200).isActive = true
view.backgroundColor = .green
return view
}()
}