init 中的子视图自动布局约束

时间:2021-07-07 15:53:30

标签: ios swift uiview uiscrollview uikit

我有一个自定义 UIView,它是 UIScrollView 的子类。在 init(_ frame) 方法中,我添加了一个子视图,如下所示:

    contentView = ContentView()
    contentView.backgroundColor = UIColor.blue
    contentView.translatesAutoresizingMaskIntoConstraints = false

    self.addSubview(contentView)

    contentView.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true
    contentView.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true
    contentView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
    contentView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
    
    // create contentView's Width and Height constraints
    cvWidthConstraint = contentView.widthAnchor.constraint(equalToConstant: 0.0)
    cvHeightConstraint = contentView.heightAnchor.constraint(equalToConstant: 0.0)
           
    // activate them
    cvWidthConstraint.isActive = true
    cvHeightConstraint.isActive = true

    cvWidthConstraint.constant = timelineWidth //It's non-zero
    cvHeightConstraint.constant = 2.0*frame.height

问题是 contentView 框架需要时间来更新。它当然不会在 init(_ frame) 调用中更新。什么时候设置 contentView 框架,如何捕捉框架更新事件?

2 个答案:

答案 0 :(得分:1)

内部

override func layoutSubviews() {
  super.layoutSubviews()
  // to do  
}

您获得父视图实际框架,但请记住,因为它被多次调用

答案 1 :(得分:0)

在设置约束之前,我会确保将视图添加到父视图,例如“self.addSubview(contentView)”。如果“self”视图已经添加到视图层次结构中,那么 contentView 布局将立即生效。或者,您可以覆盖方法 viewDidMoveToSuperview,然后检查 superview 是否不为零,如果是,则初始化并将子视图 contentView 插入其中