自动布局的 UIScrollView 内容大小问题

Posted

技术标签:

【中文标题】自动布局的 UIScrollView 内容大小问题【英文标题】:UIScrollView Content Size Issue With Auto Layout 【发布时间】:2016-06-25 02:32:20 【问题描述】:

当我向 UIScrollView 添加多个子视图时,ScrollView 的 contentsSize 不会自动更改(正如指南所建议的那样)。

如果我将 contentsSize 设置为宽度的 6 倍(我正在制作 6 页滚动视图),则视图布局正确。但是我没有手动设置contentsSize,scrollView 不会滚动,contentsSize(0,0)

显而易见的答案是手动设置contentSize,但我很担心我有一个更基本的问题(或对自动布局的误解),这会在以后伤害我。我的代码如下:

 override func viewDidLoad() 
    super.viewDidLoad()

    //Adding a Paging ScrollView to ViewController
    let sv = UIScrollView() 
    view.addSubview(sv)
    sv.pagingEnabled = true

    let allC1 = NSLayoutConstraint.constraintsWithVisualFormat("H:|[sv]|", options: .DirectionLeadingToTrailing, metrics: nil, views: ["sv": sv])
    let allC2 = NSLayoutConstraint.constraintsWithVisualFormat("V:|[sv]|", options: .DirectionLeadingToTrailing, metrics: nil, views: ["sv": sv])
    NSLayoutConstraint.activateConstraints(allC1+allC2)

    sv.translatesAutoresizingMaskIntoConstraints = false

    var subViewConstraints:[NSLayoutConstraint] = []
    var mySubViews:[UIView] = []

    //First SubView Add & Layout
    let firstView = UIView(withIndex: 0)
    mySubViews.append(firstView)
    sv.addSubview(firstView)
    let cWidth = NSLayoutConstraint(item: tempView, attribute: .Width, relatedBy: .Equal, toItem: sv, attribute: .Width, multiplier: 1.0, constant: 0.0)
    let cHeight = NSLayoutConstraint(item: tempView, attribute: .Height, relatedBy: .Equal, toItem: sv, attribute: .Height, multiplier: 1.0, constant: 0.0)
    var subViewConstraints :[NSLayoutConstraint] = [cWidth, cHeight]

    //Second through Sixth SubView Add & Layout
    for i in 1..<6 
        let tempView = UIView()
        mySubViews.append(tempView)
        sv.addSubview(tempView)
        let cWidth = NSLayoutConstraint(item: tempView, attribute: .Width, relatedBy: .Equal, toItem: mySubViews[i-1], attribute: .Width, multiplier: 1.0, constant: 0.0)
        let cHeight = NSLayoutConstraint(item: tempView, attribute: .Height, relatedBy: .Equal, toItem: mySubViews[i-1], attribute: .Height, multiplier: 1.0, constant: 0.0)
        let cLeading = NSLayoutConstraint(item: tempView, attribute: .Leading, relatedBy: .Equal, toItem: mySubViews[i-1], attribute: .Trailing, multiplier: 1.0, constant: 0.0)
        subViewConstraints += [cWidth, cHeight, cLeading]
    

    NSLayoutConstraint.activateConstraints(subViewConstraints)

【问题讨论】:

我正在做基本的事情,我添加了滚动视图,而不是滚动视图中的视图,它将包含所有子视图。定义该视图的高度约束并解决问题。我所做的是使用 ScrollView 与 Scrollview、Top、Bottom、MaginLeft 和尾随空间相等宽度并定义视图的显式高度 & 问题已解决,我不做任何编码一切都由 Storyboard 处理 【参考方案1】:

从我所看到的操作 UIScrollViews 来看...最好不要在 viewDidLoad() 中这样做。 viewDidLoad() 似乎适用于 IB 中的 any x any size 类,并且不考虑创建其他大小类所需的调整大小。

每当我向 UIScrollViews 添加任何内容时,我都会在 viewDidAppear() 中完成所有操作,因为 viewDidAppear() 似乎考虑了您的屏幕尺寸和约束,而 viewDidLoad() 实际上只是用于初始化和应该保持真实的事情该应用程序始终可用(大部分情况下)。

【讨论】:

感谢您的回复,但不幸的是,这并没有解决问题。我尝试将约束代码移动到viewDidAppear(),并尝试使用viewWillApear(),问题仍然存在。

以上是关于自动布局的 UIScrollView 内容大小问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在具有自动布局的操作上自动增加 UIScrollView 中的内容大小?

UIScrollView 不使用自动布局滚动(内容视图框架大小以编程方式更改)

如何让 UIScrollView 适合其内容大小,直到在自动布局中滚动之前达到最大值

具有自动布局的 UIScrollView 中的动态大小的 UITableView

UIScrollView setContentSize 使用自动布局打破视图

另一个 uiscrollview 自动布局问题