0515.View Hierarchy [UIKit]

几个单词

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];

思考:很明显现在的视图层次是:UIWindow -> View_yellow-> View_blue,此时self.window.subviews打印的结果是:

views:(

"<UIView:0x8f1ecc0; frame = (50 50; 100 100); layer = <CALayer:0x8f1ed20>>",

"<UIView:0x8f13330; frame = (0 0; 100 100); layer = <CALayer: 0x8f1d800>>"

)

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:(UIView *)subview;

- (void)willMoveToSuperview:(UIView *)newSuperview;
- (void)didMoveToSuperview;
- (void)willMoveToWindow:(UIWindow *)newWindow;
- (void)didMoveToWindow;

思考:视图回调主要是用于跟踪视图的相关改变

5、Set view tag and search view

myView.tag = 1011;

UILabel *label =(UILablel *)[self.view viewWithTag:1011];

6、isDescendantOfView

- (BOOL)isDescendantOfView:(UIView
*)view;

思考:主要用于判断的一个View是不是另一个View的子subView

0515.View Hierarchy [UIKit]

时间: 2024-10-10 22:54:25

0515.View Hierarchy [UIKit]的相关文章

错误:Only the original thread that created a view hierarchy can touch its views——Handler的深入解析

这个错误很常见,基本上写线程操作都遇到过这个错误.根本原因是view控件的线程安全问题,通俗点讲就是所有的更新UI操作都需要在主线程(也就是UI线程中完成),而不能在新开的子线程中操作. 基本思路:既然子线程需要更新UI,但子线程自身又不能完成任务,所以只能通过建立一个通信机制,当子线程需要更新UI时,发消息通知主线程并将更新UI的任务post给主线程,让主线程来完成分内的UI更新操作.这个机制是什么呢?就是Handler.Handler 从属于谁?当然是主线程.每个线程都有自己的handler

0521.如何拆分View Controller进而实现轻量级的View Controller[UIKit]

参考文章来自objcio网站 为什么要编写轻量级的View Controller?? 1.作为iOS项目中最大的文件,ViewControllers中的代码复用率几乎是最低的 2.重量级的View COntroller加大了测试的复杂度. 所以关注ViewController的瘦身,把业务逻辑.网络请求.Views的代码移到合适的地方,进而提高代码可读性.降低耦合.提高复用.降低测试难度极为重要 一.把DataSource和其他Protocols分离出来 比如uiTableView中的DataS

view hierarchy iOS

view hierarchy是用来说明在window中的view之间的关系的. 可以把view hierarchy认为是一棵翻转的tree structure,而window就是这棵树的最上面的节点(根节点).树的下面就是父子view之间的关系.从视觉上来看,view hierarchy就是一个封闭的结构,就是一个view包含一个或多个view,而window包含所有的view. view hierarchy同时也是responder chain的重要部分,当我们需要渲染window中的内容的时

Only the original thread that created a view hierarchy can touch its views.

/********************************************************************************** * Only the original thread that created a view hierarchy can touch its views. * 说明: * 自定义view的时候出现这个错误,是用错了方法. * * 2016-6-15 深圳 南山平山村 曽剑锋 ****************************

DDMS android 开发工具-----dump View Hierarchy for UI automator

今天又发现一个好工具  dump View Hierarchy 对学习UI布局很有好处,操作也很简单的,直接上图说话了

浅析Android中的消息机制-解决:Only the original thread that created a view hierarchy can touch its views.

在分析Android消息机制之前,我们先来看一段代码: [html] view plaincopyprint? public class MainActivity extends Activity implements View.OnClickListener { private TextView stateText; private Button btn; @Override public void onCreate(Bundle savedInstanceState) { super.onC

Only the original thread that created a view hierarchy can touch its views异常

写代码的时候碰到android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.这个异常.异常的意思是说只有创建这个view的线程才能操作这个view,普通会认为是将view创建在非UI线程中才会出现这个错误.可是在我代码中将view创建在UI线程中也会出现这个错误 下面是我出错的代码: Asyn

Dump View hierarchy for UI Automator

DDMS -> Dump View Hierarchy for UI Automator 这个是用来分析你当前界面的View层次节点的,假设你现在是在用模拟器手机做调试,你用这个他就会构建一个你先在手机或模拟器显示界面的View的层次图, 你可以做一些性能的调优之类的 和 hierarchyviewer.bat  工具类似

Android: Only the original thread that created a view hierarchy can touch its views 异常

最近自己再写一个小项目练手,创建一个线程从网络获取数据然后显示在 recyclerView 上.写好后发现页面能够显示,但是有时候会把请求的数据显示过来,有时候不会.点开 android monitor 一看,有一个提示 : Only the original thread that created a view hierarchy can touch its views. 异常的意思是说只有创建这个view的线程才能操作这个 view,普通会认为是将view创建在非UI线程中才会出现这个错误.