UIView不可不知的秘密

作者: Dwyane_Coding | 来源:发表于2017-05-15 23:29 被阅读417次
    图片来源于网络

    前言:

    1、在Mac OS中NSWindow的父类是NSResponder,而在iOS中UIWindow的父类是UIView。程序一般只有一个窗口但是会又很多视图。
    2、UIView的作用:描画和动画,视图负责对其所属的矩形区域描画、布局和子视图管理、事件处理、可以接收触摸事件、事件信息的载体等等。

    我在前面详细介绍了setNeedsDisplaysetNeedsLayout和layoutIfNeeded 详情请点击。

    下面介绍的是view添加以及删除时所触发的方法

    // 当视图添加子视图时调用
    - (void)didAddSubview:(UIView *)subview;
    // 当子视图从本视图移除时调用
    - (void)willRemoveSubview:(UIView *)subview;
    // 当视图即将加入父视图时 / 当视图即将从父视图移除时调用
    - (void)willMoveToSuperview:(nullable UIView *)newSuperview;
    // 当试图加入父视图时 / 当视图从父视图移除时调用
    - (void)didMoveToSuperview;
    // 当视图即将加入父视图时 / 当视图即将从父视图移除时调用
    - (void)willMoveToWindow:(nullable UIWindow *)newWindow;
    // 当视图加入父视图时 / 当视图从父视图移除时调用
    - (void)didMoveToWindow;

    上面是资料说的,究竟对不对呢?我们用swift版的代码来验证下。

    先自定义一个<code>TestView</code>类
    TestView代码如下:

    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // 当试图加入父视图时 / 当视图从父视图移除时调用
    override func didMoveToSuperview() {
        print("\(#function)")
    }
    // 当视图即将加入父视图时 / 当视图即将从父视图移除时调用
    override func willMove(toSuperview newSuperview: UIView?) {
        print("\(#function)")
    
    }
    
    override func didAddSubview(_ subview: UIView) {
        print("3秒后\(#function)")
    
    }
    override func willRemoveSubview(_ subview: UIView) {
        print("6秒后\(#function)")
    }
    

    然后将该TestView创建实例,添加到控制器的view,设背景色为紫色,并将001赋给tag值

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let testV = TestView()
        testV.frame = self.view.bounds
        testV.backgroundColor = UIColor.purple
        testV.tag = 001
        self.view.addSubview(testV)
    
    

    上面方法触发了willMove(toSuperview:)didMoveToSuperview(),验证了当视图即将加入父视图时和当试图加入父视图时调用

    之后在viewDidLoad添加一个带有延迟的添加红色view代码,值得一提的是,这是最新swift3.1的GCD延时方法
    //如果不需要在主线程执行,就去掉main

    DispatchQueue.main.asyncAfter(deadline: .now()+3.0) {
        let view = UIView.init(frame: CGRect(x: 10, y: 100, width: 100, height: 60))
        view.backgroundColor = UIColor.red
        testV.addSubview(view)    
    }
    

    上面方法触发了didAddSubview,验证了当视图添加子视图时会调用

    DispatchQueue.main.asyncAfter(deadline: .now()+6.0, execute: {
        let tagView: TestView = self.view .viewWithTag(001) as! TestView
        tagView.removeFromSuperview()
    })
    

    上面方法触发了willRemoveSubview,验证了当子视图从本视图移除时会被调用,同时,willMove(toSuperview:)didMoveToSuperview()也被调用了,分别验证了当视图即将从父视图移除时 和 当视图从父视图移除时会被调用

    经证实,资料所述属实。
    人家发现的即便是对,但终归是人家的,只有自己验证才是属于自己的。

    相关文章

      网友评论

      本文标题:UIView不可不知的秘密

      本文链接:https://www.haomeiwen.com/subject/igbhxxtx.html