【问题标题】:UIScrollView contentInset Autolayout issueUIScrollView contentInset 自动布局问题
【发布时间】:2018-12-01 01:04:55
【问题描述】:

我有一个自定义 UIView,它有一个 UIScrollView 作为子视图。我的问题是当视图调整大小时,我希望调整滚动视图的大小并将其 contentInset 重置为:

  scrollView.contentInset = UIEdgeInsets(top: self.bounds.height/2, left: 0, bottom: self.bounds.height/2, right: 0)

如何使用自动布局来做到这一点?

【问题讨论】:

    标签: ios uiview uiscrollview autolayout ios-autolayout


    【解决方案1】:

    给定这样的视图布局:

    您可以在容器视图MyView 更改大小时自动更改UIScrollView contentInset 属性,使用视图的bounds 属性的didSet 属性:

    import UIKit
    
    class MyView: UIView {
    
        weak var scrollView: UIScrollView!
    
        override var bounds: CGRect {
            didSet {
                scrollView.contentInset = UIEdgeInsets(top: bounds.height / 2, left: 0, bottom: bounds.height / 2, right: 0)
            }
        }
    }
    
    class ViewController: UIViewController {
    
        @IBOutlet weak var myView: MyView!
        @IBOutlet weak var scrollView: UIScrollView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            myView.scrollView = scrollView
        }
    }
    

    请务必注意,当内容插入发生更改时,您可能看不到这些更改,因为例如,当内容插入减少时,滚动视图的内容不会自动滚动到边缘。您必须使用滚动才能看到内容插图确实发生了变化。

    【讨论】:

    • 这给我们带来了另一个问题,观察 UIView 上的边界变化。是否会始终调用此设置器?一些答案,例如forums.developer.apple.com/thread/104489,表明它不可靠。
    • 嗯,我明白了。有什么方法可以直接挂钩调整滚动视图大小的事件?例如。设备方向更改,或任何导致滚动视图更改大小的事件。
    猜你喜欢
    • 2012-09-16
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 2021-11-17
    • 1970-01-01
    相关资源
    最近更新 更多