gpt4 book ai didi

ios - 使用 UIScrollView 和 AutoLayout 以编程方式创建 Controller 未正确调整 View 大小

转载 作者:可可西里 更新时间:2023-10-31 23:56:35 24 4
gpt4 key购买 nike

我正在尝试以编程方式创建一个 View Controller ,它将以可滚动的方式布置 subview 。我正在尝试将 AutoLayout 与 UIScrollView 一起使用,并已阅读所有这方面的技术说明和 SO 答案。但我无法做到这一点 - 似乎我在这里缺少的创建/使用或 UIScrollView 有一些细微差别。

我的代码在下面,我看到的输出也显示在下面的图片中。

我的期望是我会看到占据整个屏幕的棕色和绿色条纹( subview )。我知道我必须指定 subview 的高度,但我不明白为什么水平尺寸调整不起作用。如果我不指定水平尺寸,我希望我的 subview 被拉伸(stretch)并占据屏幕的宽度,但它并没有这样做。

这是我的 Controller 的代码。

class ScrollableRowHeadersViewController : UIViewController {

var scrollView : UIScrollView!

override func loadView() {
self.view = UIView(frame: CGRectZero)
scrollView = UIScrollView()
scrollView.setTranslatesAutoresizingMaskIntoConstraints(false)
self.view.addSubview(scrollView)
scrollView.backgroundColor = UIColor.blueColor()
self.view.addVisualConstraint("H:|-0-[scrollView]-0-|", viewsDict: ["scrollView" : scrollView])
self.view.addVisualConstraint("V:|-0-[scrollView]-0-|", viewsDict: ["scrollView" : scrollView])
self.view.contentMode = UIViewContentMode.Redraw
}

//load all the subviews after the main view and scrollview loaded.
override func viewDidLoad() {
var viewsDict = [String: UIView]()
var vertical_constraints = "V:|"
scrollView.autoresizesSubviews = true

for i in 1...100 {
var subview = UIView()
subview.setTranslatesAutoresizingMaskIntoConstraints(false)
subview.backgroundColor = (i%2 == 0 ? UIColor.brownColor() : UIColor.greenColor())
viewsDict["subview_\(i)"] = subview
self.scrollView.addSubview(subview)
vertical_constraints += "[subview_\(i)(==50)]"
self.scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[subview_\(i)]|", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDict))
}

vertical_constraints += "|"
self.scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(vertical_constraints, options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDict))
}

这是水平约束设置为 H:|[subview_(i)]| 的输出

H:|[subview_(i)]|

这是水平约束设置为 H 的输出:|[subview_(i)(==100)]|

H:|[subview_(i)(==100)]|

无论哪种情况,我都希望在整个屏幕宽度上看到交替出现的棕色和绿色条纹。

我错过了什么?在此先感谢您的帮助。

最佳答案

经过更多的痛苦和仔细阅读,这种行为的原因和答案变得更加清晰。在 this SO question 中也有很好的描述。 .我希望技术说明更英文化,但@rdelmar 和@Rob 解释得非常清楚“contentView 的约束用于设置 scrollView 的 contentSize”。

这是修改后的代码和结果(我认为这是正确的解决方案)。我的 View 层次结构现在是这样的:ViewController -> UIView (mainView) -> UIScrollVIew -> UIView (contentView) -> UIViews ( subview )

contentView 和 mainView 之间有额外的宽度限制。此外,所有 subview 都添加到 contentView 而不是直接添加到 scrollView。

class ScrollableRowHeadersViewController : UIViewController {

var scrollView : UIScrollView!
var contentView : UIView!

override func loadView() {
super.loadView()
self.view = UIView(frame: CGRectZero)
scrollView = UIScrollView(frame:CGRectZero)
scrollView.sizeToFit()
scrollView.setTranslatesAutoresizingMaskIntoConstraints(false)
self.view.addSubview(scrollView)
scrollView.backgroundColor = UIColor.blueColor()

contentView = UIView()
contentView.setTranslatesAutoresizingMaskIntoConstraints(false)
contentView.backgroundColor = UIColor.redColor()
scrollView.addSubview(contentView)

self.view.addVisualConstraint("H:|-0-[scrollView]-0-|", viewsDict: ["scrollView" : scrollView])
self.view.addVisualConstraint("V:|-0-[scrollView]-0-|", viewsDict: ["scrollView" : scrollView])

self.view.addVisualConstraint("H:|[contentView]|", viewsDict: ["contentView" : contentView])
self.view.addVisualConstraint("V:|[contentView]|", viewsDict: ["contentView" : contentView])

//make the width of content view to be the same as that of the containing view.
self.view.addVisualConstraint("H:[contentView(==mainView)]", viewsDict: ["contentView" : contentView, "mainView" : self.view])

self.view.contentMode = UIViewContentMode.Redraw
}

//load all the subviews after the main view and scrollview loaded.
override func viewDidLoad() {
var viewsDict = [String: UIView]()
viewsDict["contentView"] = contentView
viewsDict["super"] = self.view
var vertical_constraints = "V:|"

for i in 1...50 {
var subview = UIView()
subview.setTranslatesAutoresizingMaskIntoConstraints(false)
subview.backgroundColor = (i%2 == 0 ? UIColor.brownColor() : UIColor.greenColor())
viewsDict["subview_\(i)"] = subview
contentView.addSubview(subview)

vertical_constraints += "[subview_\(i)(==50)]"
self.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[subview_\(i)]|", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDict))
}

vertical_constraints += "|"
self.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(vertical_constraints, options: NSLayoutFormatOptions.AlignAllLeft, metrics: nil, views: viewsDict))
}

这是我期望的输出:

enter image description here

关于ios - 使用 UIScrollView 和 AutoLayout 以编程方式创建 Controller 未正确调整 View 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28057610/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com