Swift - 在viewDidLoad和viewDidAppear上查看不同的位置

r.p*_*pul 1 viewdidload viewdidappear ios swift

我有一个理解问题...我创建了两个相似的视图(相同的原点和相同的大小)和剖面视图,而我创建了这些视图 - 一个在viewDidLoad另一个中viewDidAppear- 当我在原点x和y中放置相似的起点引用第i部分的每个视图都将这些视图放在不同的位置.有人可以解释一下这些观点不在同一个位置的原因是什么?

import UIKit

class ViewController: UIViewController {

    @IBOutlet var sec: UIView!

    override func viewDidLoad() {
        let shape = UIView(frame: CGRect(x: sec.frame.width/2, y: sec.frame.height/2, width: 100, height: 100));
        shape.backgroundColor = UIColor.redColor();
        view.addSubview(shape); 
    }

    override func viewDidAppear(animated: Bool) {    
        let shape2 = UIView(frame: CGRect(x: sec.frame.width/2, y: sec.frame.height/2, width: 100, height: 100));
        shape2.backgroundColor = UIColor.greenColor();
        view.addSubview(shape2);
    }
}
Run Code Online (Sandbox Code Playgroud)

Sha*_* Of 5

原因是因为viewDidAppear在autolayout引擎完成它之后调用的方法,viewDidLoad- 之前.在自动布局完成之前,在大多数情况下,屏幕上任何视图的帧都不正确.viewDidLayoutSubviews当自动布局完成且帧正确时,您可以将方法用作最近点.请注意,此方法可以多次调用.

UPD. 默认情况下,autolayout用于viewin UIViewController,以及故事板中的视图; 您在代码中添加了自定义视图,这些视图不使用autolayout.您应该仔细混合自动布局和帧初始化视图.