开发过程中,我们经常需要查看一个视图及其子视图的层级关系,这里提供两个方法:
1)递归遍历
对于一个视图rootview,我们可以通过UIView的方法subviews获取到它的直接子视图,
这里有一点需要注意,[rootview subviews]返回的子视图数组是rootview的直接子视图,即数组里面每个视图在视图层级树中与rootview有直接的父子关系,且子视图数组里面并不包含rootview本身(注意和数学中集合的子集进行区别),数组中的顺序从小到大对应视图层级的从底部(bottom)到顶端(top)
基于以上说明,我们可以利用递归的思想遍历获取rootview的所有直接和非直接的子视图
/**
* @brief 递归遍历
*
* @param rootView 当前视图节点
* @param floor 当前视图节点在视图层级树中的层数索引
*/
- (void)view:(UIView *)rootView floor:(NSInteger)floor
{
NSLog(@"<%@>-第%i层",[rootView class],floor);
floor++;
for (UIView *v in [rootView subviews])
{
[self view:v floor:floor];
}
}
2)利用recursiveDescription方法
UIView有一个私用方法recursiveDescription,配合po(print-object)命令可以打印出视图的层级关系
po [rootview recursiveDescription]