在iOS中获取UIView的所有层级结构

应用场景

在实际 iOS 开发中,很多时候都需要知道某个 UI 控件中包含哪些子控件,并且分清楚它们的层级结构和自个的 frame 以及 bounds ,以便我们完成复杂的 UI 布局,下面的代码就能很方便的获取某个 UI 控件的所有的层级结构,我们可以用它计算,然后把结果写入到本地磁盘,导出成XML文件,这样我们就可以很直观的看出它内部的细节。

/*** 返回传入veiw的所有层级结构** @param view 需要获取层级结构的view** @return 字符串*/
- (NSString *)digView:(UIView *)view
{if ([view isKindOfClass:[UITableViewCell class]]) return @""; // 1.初始化 NSMutableString *xml = [NSMutableString string]; // 2.标签开头 [xml appendFormat:@"<%@ frame=\"%@\"", view.class, NSStringFromCGRect(view.frame)]; if (!CGPointEqualToPoint(view.bounds.origin, CGPointZero)) { [xml appendFormat:@" bounds=\"%@\"", NSStringFromCGRect(view.bounds)]; } if ([view isKindOfClass:[UIScrollView class]]) { UIScrollView *scroll = (UIScrollView *)view; if (!UIEdgeInsetsEqualToEdgeInsets(UIEdgeInsetsZero, scroll.contentInset)) { [xml appendFormat:@" contentInset=\"%@\"", NSStringFromUIEdgeInsets(scroll.contentInset)]; } } // 3.判断是否要结束 if (view.subviews.count == 0) { [xml appendString:@" />"]; return xml; } else { [xml appendString:@">"]; } // 4.遍历所有的子控件 for (UIView *child in view.subviews) { NSString *childXml = [self digView:child]; [xml appendString:childXml]; } // 5.标签结尾 [xml appendFormat:@"</%@>", view.class]; return xml; }

举例:非常经典的UITableView

UITableViewCell *cell=(UITableViewCell *)[[[textView superview]superview] superview];

UITableView *myTableView=(UITableView *)[[(UITableViewCell*)[[[textView superview] superview] superview] superview]superview];

UIView *myView = (UIView*)[myTableView superview];

 

(lldb) po cell

<ThreeElementsCell: 0xc4eeab0; baseClass = UITableViewCell; frame = (0 296; 768 44); autoresize = W; layer = <CALayer: 0xc4ee060>>

(lldb) po [textView superview]

<UITableViewCellContentView: 0xc4f0230; frame = (0 0; 768 43); opaque = NO; gestureRecognizers = <NSArray: 0xc4f9770>; layer = <CALayer: 0xc4ee090>>

(lldb) po [[textView superview] superview]

<UITableViewCellScrollView: 0xc4f9150; frame = (0 0; 768 44); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0xc4f93b0>; layer = <CALayer: 0xc4f9320>; contentOffset: {0, 0}>

(lldb) po [[[textView superview] superview] superview]

<ThreeElementsCell: 0xc4eeab0; baseClass = UITableViewCell; frame = (0 296; 768 44); autoresize = W; layer = <CALayer: 0xc4ee060>>

(lldb) po [cell superview]

<UITableViewWrapperView: 0xb5b8ea0; frame = (0 0; 768 964); autoresize = W+H; layer = <CALayer: 0xb5b8f10>>

(lldb) po [[cell superview] superview]

<TPKeyboardAvoidingTableView: 0xcc5aa00; baseClass = UITableView; frame = (0 0; 768 964); clipsToBounds = YES; autoresize = LM; gestureRecognizers = <NSArray: 0xb5b7880>; layer = <CALayer: 0xb5b6e80>; contentOffset: {0, -64}>

(lldb) 

 

解析:textView是用xib直接拖了一个UITextView放在UITableViewCell的一个控件,我在上述代码的后面设置了一个断点,打印如上面所示,由此可知,不难得出iOS7UITableView的结构相对iOS7以下的版本发生的变化,iOS7以前的版本是UITalbeView下直接就是UITableViewCell,UITableViewCell下是contentView,用xib拖放的控件就是直接放在了contentView上面,而iOS7以上的版本则是UITalbeView有一个subview-UITableViewWrapperView,UITableViewWrapperView的subview才是UITableViewCell,UITableViewCell的一个subview是UITableViewCellScrollView,UITableViewCellScrollView的subview才是contentView,contentView上面拖放的才是你放上去的控件,所以在iOS版本适配时在此要作相应的版本判断,并进行处理。

参考链接:
1.http://blog.csdn.net/software_notes/article/details/18262813
2.http://blog.csdn.net/chenyblog/article/details/44490659

在iOS中获取UIView的所有层级结构 相关相关推荐

  1. IOS中获取各个文件的目录路径的方法和NSFileManager类

    转自:http://blog.sina.com.cn/s/blog_5fb39f910101di92.html IOS中获取各种文件的目录路径的方法 iphone沙箱模型的有四个文件夹,分别是什么,永 ...

  2. iOS - 中获取各种文件的目录路径的方法

    转自:https://www.cnblogs.com/zrr-notes/p/5953445.html 我们的app在手机中存放的路径是:/var/mobile/Applications/4434-4 ...

  3. wordpress php 链接,WordPress中获取页面链接和标题的相关PHP函数用法解析

    get_permalink()(获取文章或页面链接)get_permalink() 用来根据固定连接返回文章或者页面的链接.在获取链接时 get_permalink() 函数需要知道要获取的文章的 I ...

  4. iOS中获取WiFi的SSID(CNCopySupportedInterfaces())

    获取当前设备连接WiFi: ios5之前可以通过读取配置文件获取,ios5以后苹果修改wifi列表文件位置,只有root权限才可以读取. ios4:/System/Library/SystemConf ...

  5. iPhone PHP获取文件,IOS中获取各种文件的目录路径的方法

    iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app,Library. (NSHomeDirectory ...

  6. iOS中的UIView

    2019独角兽企业重金招聘Python工程师标准>>> UIView UIView的位置 - (void)viewDidLoad {[super viewDidLoad];//新建三 ...

  7. (转)IOS中获取各种文件的目录路径的方法

    iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么.documents,tmp,app,Library.(NSHomeDirectory() ...

  8. ios中获取各种文件的目录路径方法

    2019独角兽企业重金招聘Python工程师标准>>> iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. docume ...

  9. iOS中获取相册、相机、定位、以及麦克风权限设置

    1.判断用户是否获取了相册的访问权限 #import <AssetsLibrary/AssetsLibrary.h>// 获取相册权限 - (void)getPhotoLibraryAut ...

  10. iOS中的UIView的基本属性1

    @interface AppDelegate ()@end@implementation AppDelegate- (BOOL)application:(UIApplication *)applica ...

最新文章

  1. Python闭包及其作用域
  2. cass软件yy命令_WIN10系统中的CASS字体问题
  3. 如何在多台web服务器上共享session?
  4. 选择大公司还是小公司
  5. Anroid View事件响应机制和ViewGroup的事件响应分发机制
  6. 系统分析师资料_软考 系统分析师考试通过总结
  7. 在WPF中开启摄像头扫描二维码(Media+Zxing)
  8. python 通达信函数_python调用通达信公式,大智慧公式转python
  9. OpenKG开源系列 | 轻量级知识图谱抽取开源工具OpenUE
  10. mysql 1548_MySQL创建函数由于Error 1548失败
  11. Vue # Avoid mutating a prop directly since the value will be overwritten wheneve
  12. 物联网云平台应用于远程污水在线检测
  13. ubuntu 14.04 wifi peap 选择证书问题
  14. 计算机三级网络技术最全知识点总结【5】
  15. ov2604寄存器配置
  16. webgl-原生纹理贴图
  17. DIP,QFP,PFP,PGA,BGA封装介绍
  18. 英飞凌XMC系列单片机教程 第一章,开发环境的搭建
  19. psd文件生产html,PSD文件切图制作html全过程记录
  20. 抓取网页(3)之部分工程文件

热门文章

  1. paip.Java Annotation注解的作用and 使用
  2. Rust : 高富帅的match
  3. 企业如何高效用云?| 资深运维架构师细说云架构下的运维体系构建
  4. 农业银行网银兼容银河麒麟软件操作系统试点成功
  5. OpenStack Queens版本Security项目介绍
  6. 【路径规划】基于matlab帝国企鹅算法求解机器人栅格地图避障路径规划问题【含Matlab源码 784期】
  7. 【数学建模】基于matlab GUI弱肉强食问题—Volterra 模型【含Matlab源码 1502期】
  8. 【优化算法】动态粒子群算法的动态环境寻优算法【含Matlab源码 1125期】
  9. 【人脸表情识别】基于matlab GUI CNN人脸表情识别【含Matlab源码 787期】
  10. 【CVRP】基于matlab节约算法求解带容量的车辆路径规划问题【含Matalb源码 157期】