iOS addSubview的特殊点

首先,我们先看一个动画:


33333.gif

有这样一个黄色的子组件UILabel,我在点击上面两个按钮时,让绿色 和 蓝色的view,来回addSubbiew:label 。

    WEAK_SELF;
    [self.btnOne bk_whenTapped:^{
        STRONG_SELF;
        [self.viewOne addSubview:self.lb];
    }];

    [self.btnTwo bk_whenTapped:^{
        STRONG_SELF;
        [self.viewTwo addSubview:self.lb];
    }];

我们看到有两个结果:

1.当添加到另外一个父view时,当前父view没有调用removeview方法,但实际上前父view已经不再持有子view;

2.动画最后,我多次连续点击左边按钮,连续调用[self.viewOne addSubview:self.lb],但viewOne并没有重复添加多个子view。

这两种现象表明:addSubview 一个子组件时,先会把之前父组件和子组件的关系断开,然后根据最新的父组件,建立新的父子关系。

查看addSubview的指导文档

Discussion
This method establishes a strong reference to view and sets its next responder to the receiver, 
which is its new superview.

Views can have only one superview. 
If view already has a superview and that view is not the receiver, 
this method removes the previous superview before making the receiver its new superview.

翻译一下:
子视图只能有一个父视图;当调用addSubview时,如果子view已经有了父视图,会移除之前的接收关系,由新的父视图建立接收关系。

理解了这个点,我们在做一些视图交互时,就能写出更精简准确的代码。
参考链接

你可能感兴趣的:(iOS addSubview的特殊点)