首页 > 解决方案 > UIScrollView,来自 viewDidLayoutSubviews 的 contentView 边界错误

问题描述

我正在以编程方式创建 UIScrollView。为此,我有这样的事情

final class MyViewController: UIViewController {


    private lazy var scrollView: UIScrollView = {
        let scrollView = UIScrollView()
        scrollView.bounces = false
        return scrollView
    }()

    private lazy var contentView: UIView = {
        return UIView()
    }()

    private lazy var myScrolledView: MyScrolledView = {
        return MyScrolledView()
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(scrollView)
        scrollView.addSubview(contentView)

        contentView.addSubview(myScrolledView)

        // ScrollView Contraints
        scrollView.translatesAutoresizingMaskIntoConstraints = false
        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

        // ContentView Constraints
        contentView.translatesAutoresizingMaskIntoConstraints = false
        contentView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
        contentView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
        contentView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
        contentView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
        contentView.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true
        contentView.heightAnchor.constraint(equalTo: scrollView.heightAnchor).isActive = true

        // MyScrolledView Constraints
        myScrolledView.translatesAutoresizingMaskIntoConstraints = false
        myScrolledView.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true
        myScrolledView.centerYAnchor.constraint(equalTo: contentView.centerYAnchor).isActive = true
        myScrolledView.widthAnchor.constraint(equalToConstant: 500).isActive = true
        myScrolledView.heightAnchor.constraint(equalToConstant: 500).isActive = true
    }
}

这工作正常,我可以毫无问题地滚动视图。

现在我需要从 viewDidLayoutSubviews 调整一些视图。但是我知道我的 contentView 和 scrolledView 的大小为零。

将以下代码添加到我的视图控制器。

 override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    print(scrollView.bounds)
    print(contentView.bounds)
    print(myScrolledView.bounds)
}

呈现视图时生成此输出。

(0.0, -70.0, 1112.0, 834.0)
(0.0, 0.0, 0.0, 0.0)
(0.0, 0.0, 0.0, 0.0)

为什么此时我的 contentView 和 myScrolledView 的大小不正确?我们如何才能得到这些视图的实际界限?

标签: iosswiftuiscrollviewautolayout

解决方案


推荐阅读