0515.View Hierarchy [UIKit](一)

2014-11-24 12:57:11 · 作者: · 浏览: 18

几个单词

Hierarchy['ha r k ]n.层级

思考:每个视图有一个父视图,有0个或者多个子视图

Manipulation[m ,n pj 'le ( )n] n.操纵;操作

Descendant[d 'send( )nt] n. 后裔;子孙


UIWindow

Feature:

1、UIWindow set up by default in Xcodetemplate project,and contains the entire view hierarchy

2、UIWindow just a view,and adds someadditional to top level view

3、Views live inside of a window

思考:UIWIndow位于toplevel,启动APP的时候首先启动,其他所有在上面的View依次渲染出现



Principle


UIView的属性

@property(nonatomic,readonly) UIView *superview;
@property(nonatomic,readonly,copy) NSArray *subviews;
@property(nonatomic,readonly) UIWindow *window;

思考:每一个View都有一个superview,有一个对应的subviews(注意是NSArraay),有一个window.所有对子视图的操作,其实本质上来讲也就是对数组的操作。视图的增删改,对应的就是数组的增删改。当然也有视图的回调方法用于跟踪视图改变。



ViewManipulation

1、add or remove in IB or using UIVIew methods

  • (void)addSubview:(UIView *)view;
  • (void)removeFromSuperview;

    示例:

        // UIWindow
        self.window.backgroundColor = [UIColor darkGrayColor];
        // view_blue
        UIView *view_a = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
        view_a.backgroundColor = [UIColor blueColor];
        // view_yellow
        UIView *view_b = [[UIView alloc]initWithFrame:CGRectMake(50, 50, 100, 100)];
        view_b.backgroundColor = [UIColor yellowColor];
       
        // 依次添加view_blue、view_yellow到UIWindow
        [self.window addSubview:view_blue];
        [self.window addSubview:view_yellow];

    \

    思考:上图很清楚的看出来,视图的层次关系是:UIWindow -> View_blue -> View_yellow

    此时如果更改添加顺序,代码和效果图如下:

    // 添加view_yellow、view_blue到UIWindow [self.window addSubview:view_yellow]; [self.window addSubview:view_blue]; [self.window addSubview:view_yellow]; [self.window addSubview:view_blue];

    \

    < http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGJyPgo8L3A+CjxwPsu8v7yjurrcw/fP1M/W1Nq1xMrTzbyy47TOysejulVJV2luZG93IC0+IFZpZXdfeWVsbG93LT4gVmlld19ibHVlo6y0y8qxc2VsZi53aW5kb3cuc3Vidmlld3O08tOhtcS94bn7ysejujwvcD4KPHA+dmlld3M6KDwvcD4KPHA+ICAgIA==" >",

    " >"

    )

    3、otherViewmanipulationmethods

    - (void)insertSubview:(UIView *)view atIndex:(NSInteger)index; - (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview; - (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview; - (void)bringSubviewToFront:(UIView *)view; - (void)sendSubviewToBack:(UIView *)view; - (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2;

    思考:每一个View的子视图其实就是一个数组,对View的子视图的操作也就是对当前view的子视图数组进行操作。常见的操作无非尾部增加、特定位置增加、删除、调整在数组中的位置、调换2个数组元素的位置而已。

    示例:

    //UIWindow
        self.window.backgroundColor = [UIColor darkGrayColor];
        //view_blue
        UIView *view_blue = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
        view_blue.backgroundColor = [UIColor blueColor];
        //view_yellow
        UIView *view_yellow =[[UIView alloc]initWithFrame:CGRectMake(50, 50, 100, 100)];
        view_yellow.backgroundColor = [UIColor yellowColor];
       
        //view_red
        UIView *view_red = [[UIView alloc]initWithFrame:CGRectMake(25, 25, 100, 100)];
        view_red.backgroundColor = [UIColor redColor];
       
        // 添加view_yellow、view_blue到UIWindow
        [self.window addSubview:view_yellow];
        [self.window addSubview:view_blue];
        [self.window insertSubview:view_red atIndex:0];
       
        NSLog(@"views:%@",self.window.subviews);

    \

    思考:上面的[self.windowinsertSubview:view_redatIndex:0];这句话其实就是把红色的view添加到UIWindow子视图数组的第1个位置,所以位于blue、yellow的下层

    如果在这句话[self.windowinsertSubview:view_redatIndex:0];后面加上这句话

    [self.windowinsertSubview:view_redatIndex:0];那么产生的效果如下:


    \

    思考:其实本质都是对UIWIndow子视图数组的操作

    4、Tracks theadditions and removals of subviews

    - (void)didAddSubview:(UIView *)subview;
    - (void)willRemoveSubview:(UIVie