Swift UIView布局子视图通知

Swift UIView布局子视图通知,swift,layout,uiview,Swift,Layout,Uiview,我有一个关于UIView布局子视图的问题 class ViewController: UIViewController { let v1 = SubView1() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. view.addSubview(v1)

我有一个关于UIView布局子视图的问题

class ViewController: UIViewController {
    let v1 = SubView1()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        view.addSubview(v1)
        
        v1.frame = CGRect(x: 50, y: 50, width: 70, height: 30)
    }
}

class SubView1: UIView {
    let subView = SubView2()
    
    override func layoutSubviews() {
        super.layoutSubviews()
        
        print("layoutSubviews SubView1")
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        var frame = subView.frame
        frame.origin = CGPoint(x: 0, y: 0)
        frame.size.width = 50
        subView.frame = frame
        
        addSubview(subView)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

class SubView2: UIView {
    let label = UILabel()
    
    override func layoutSubviews() {
        super.layoutSubviews()
        
        print("layoutSubviews SubView2")
        
        var frame = label.frame
        frame.origin = CGPoint(x: 10, y: 10)
        frame.size.width = self.frame.width - 20
        label.frame = frame
        
        label.sizeToFit()
        
        frame = self.frame
        frame.size.height = label.frame.size.height + 20
        self.frame = frame
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        label.numberOfLines = 0
        label.text = "test test test test test test test test"
        
        addSubview(label)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
此代码打印:

布局子视图子视图1
布局子视图子视图2

我想调整子视图1,使子视图1环绕子视图2。
但SubView2的frmae是在调用“layoutSubviews SubView2”时确定的。 (在“layoutSubviews子视图1”中我不知道)


我想知道如何在“layoutSubviews SubView2”之后注意到SubView1

您处理问题的方式很难。我的建议是实现你想要的

  • 使用自动布局 使用自动布局约束布局所需的布局。这是制作制作制作应用程序的实用方法
  • 无自动布局 如果您坚持不使用自动布局,则转到“viewDidLayoutSubviews”回调。这是视图控制器回调,在视图控制器布局所有视图时调用。在这里,您可以肯定地知道,此视图控制器中的所有子视图都已删除
  • 其中我更喜欢自动布局,因为在ios应用程序中有很多东西需要整理,而不是布局视图