0

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

我正在 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 中都会发生。你有什么提示吗?谢谢!

4

1 回答 1

0

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

其次,从视图控制器生命周期的知识来看,视图布局在viewDidLayout Subviews中。

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

感谢您使问题更清楚。

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

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

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

于 2021-03-12T21:20:29.813 回答