免费开源的iOS开发学习平台

UIView详解:4-视图的层次关系

在视图中可以添加子视图,通过多个视图的叠加显示,最终展示给用户。对于视图层次的管理,既可以通过InterfaceBuilder进行图形化的查看和管理,也可以通过纯代码的方式进行查看和管理,不过从实际开发经验来看,最好二选一,不要同时使用InterfaceBulider以及代码来管理子视图。

1、视图关系的常用属性和方法

  • 常用属性
@property(nullable, nonatomic,readonly) UIView       *superview;//父视图
@property(nonatomic,readonly,copy) NSArray *subviews;//所有的子视图
@property(nullable, nonatomic,readonly) UIWindow     *window;//视图所在的Window 
  • 常用方法
- (void)addSubview:(UIView *)view;//添加子视图
- (void)bringSubviewToFront:(UIView *)view;//把某个子视图移到最前显示
- (void)sendSubviewToBack:(UIView *)view;//把某个子视图移动到最后显示
- (void)removeFromSuperview;//从父视图中移除

2、通过InterfaceBuilder添加视图并设置层次关系

通过InterfaceBuilder可以借助图形化界面来添加视图类控件,如下图所示,红框内是一个UIView,其中包含了4个子控件,分别为2个UIImageView,1个UIButton,1个UISwitch。其中,在左侧的红框内,控件的排列顺序决定了其层次优先级,可以手工调整。

3、通过代码添加/移除子视图

可以通过调用UIView的addSubview:以及removeFromSuperView方法,来添加/删除子视图。添加的子视图,会被插入到subviews数组的最后,从显示效果来看,最后添加的视图显示在最前端。

示例代码:

- (IBAction)addView:(id)sender {
    UIView *addView = [[UIView alloc] init];
    addView.backgroundColor = [UIColor redColor];
    addView.frame = CGRectMake(0, 0, 100, 100);
    [self.containerView addSubview:addView];
}

4、通过代码设置层次关系

可以通过调用bringSubViewToFront:以及sendSubViewToBack:来对子视图的显示位置进行调整。当存在较多的子视图时,UIView类也提供了相对复杂的方法,来实现层级关系的精确调整,由于不太常用,此处不再赘述。

示例代码:

- (IBAction)changeLayer:(id)sender {
    //从subviews数组中,取出最后添加的视图
    UIView *lastView = (UIView *)[self.containerView.subviews lastObject]; 
   //把子视图移到最后
    [self.containerView sendSubviewToBack:lastView];
}

注意:在上方的示例代码中,使用了强制类型转换操作,因为从subviews中取出的最后一个对象,有可能是UIView的子类,如:UIImageView、UIButton等,所以进行了强转操作。

示例代码

https://github.com/99ios/7.2.4