view hierarchy iOS

view hierarchy是用来说明在window中的view之间的关系的。

可以把view hierarchy认为是一棵翻转的tree structure,而window就是这棵树的最上面的节点(根节点)。树的下面就是父子view之间的关系。从视觉上来看,view hierarchy就是一个封闭的结构,就是一个view包含一个或多个view,而window包含所有的view。

view hierarchy同时也是responder chain的重要部分,当我们需要渲染window中的内容的时候,应用程序的框架会用它来检测views的layer的层次,来决定需要渲染的部分,从而来避免做一些无用功,这点至关重要。

接下来来看下在view hierarchy中view的三个属性的定义关系

1.superview,view的父视图

2.subviews,view的子视图

3.window,包含view的window

关于第三个window属性,在iOS和Mac中是有区别的。

在iOS中window是一个view,在Mac中却不是。

在Mac中window有一个单独contentView,所有的子视图是包含在contentView中的。

在iOS中,window自己扮演了contentView的角色,所以子视图全部包含在window中。

如下图

在开发的时候,有时候会遇到

1.ios attempt to present whose view is not in the window hierarchy

2.Warning: Attempt to present on whose view is not in the window hierarchy!

等等这样类似的提示,只要里面提示有 window hierarchy,都是view hierarchy的理解不到位导致的。

上面的问题都是在一个controller的view还没加到window上的时候又取present另外一个controller,这就相当于在盖楼,2楼还没盖完,直接去盖3楼了,这样肯定是不行。

遇到上面的问题 最直接的解决方法就是在controller的viewDidAppear里面去调用present。这样可以确保view hierarchy的层次结构不乱。

时间: 2024-10-14 07:10:59

view hierarchy iOS的相关文章

错误: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

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

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.UIWindo

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线程中才会出现这个错误.

[MAC OS] XCode中的Debug View Hierarchy功能

reference to : http://blog.csdn.net/liujinlongxa/article/details/46490949 前言 做iOS开发经常会遇见这种情况,产品汪拿着你做的东西过来对你说:“这个Label的字体大小不对,我的效果图里明明标注的是20px,这个大小肯定不是20px”,于是你便跟他争论起来,我代码里设的确实是20px,为了证明你的判断,于是你开是在代码中查找设置字体的地方.这时就有一个问题,如果代码是你写,你也许可以很快的定位到相应的代码,但如果代码不是