如何在 Swift 中获取 UIView 的高度和宽度? 问题:返回零

问题描述

对于这个可能很愚蠢的问题提前抱歉 - 我是初学者

我在 viewDidLoad 中生成一个新的 UIView,提供了一些约束来将它锚定在主视图上。当谈到理解新视图的大小时,我总是得到零。

这是我的代码的简化版本,但不起作用:

    override func viewDidLoad() {
    super.viewDidLoad()
    
    let myView = UIView(frame: .zero)
    myView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(myView)
    myView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    myView.bottomAnchor.constraint(equalTo: view.bottomAnchor,constant: -200).isActive = true
    myView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
    myView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
    print(myView.bounds.width)
    
}

宽度(还有高度)返回 0。 .bounds 和 .frame 都会发生这种情况。 你有什么提示吗? 谢谢!

解决方法

第一个问题,UIView 是否显示在屏幕上?

其次,从 view controller life cycle 的知识来看,view 是在 viewDidLayout Subviews 中布局的。

因此,当视图最终出现在屏幕中时,您希望通过覆盖 myView.bounds.widthviewDidLayout Subviews 来调用 viewDidAppear

感谢您让问题更清楚。

我建议您在 viewDidLayout 子视图的第二个集合视图上重新加载数据。这样,两者就得到了现在的布局,然后第二个集合视图在第一个集合视图被放置后第二次得到布局。

另一种方法是使用相对约束。 IE。对第二个集合视图中的项目相对于第一个集合视图中的项目进行重量和高度约束。这样,其他一切都会在运行时自动为您完成。即使第一个集合视图中项目的大小稍后发生变化,这可能会影响第二个集合视图中的项目,它也会被处理掉。 (如果你可以让它工作,以获得准确的结果)

如果您能分享更多这两个集合视图的代码或屏幕截图,我将不胜感激。我可以提供更好的方法来创建它们