在iOS中获取UIView的所有层级结构 相关
在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版本适配时在此要作相应的版本判断,并进行处理。
在iOS中获取UIView的所有层级结构 相关相关推荐
- IOS中获取各个文件的目录路径的方法和NSFileManager类
转自:http://blog.sina.com.cn/s/blog_5fb39f910101di92.html IOS中获取各种文件的目录路径的方法 iphone沙箱模型的有四个文件夹,分别是什么,永 ...
- iOS - 中获取各种文件的目录路径的方法
转自:https://www.cnblogs.com/zrr-notes/p/5953445.html 我们的app在手机中存放的路径是:/var/mobile/Applications/4434-4 ...
- wordpress php 链接,WordPress中获取页面链接和标题的相关PHP函数用法解析
get_permalink()(获取文章或页面链接)get_permalink() 用来根据固定连接返回文章或者页面的链接.在获取链接时 get_permalink() 函数需要知道要获取的文章的 I ...
- iOS中获取WiFi的SSID(CNCopySupportedInterfaces())
获取当前设备连接WiFi: ios5之前可以通过读取配置文件获取,ios5以后苹果修改wifi列表文件位置,只有root权限才可以读取. ios4:/System/Library/SystemConf ...
- iPhone PHP获取文件,IOS中获取各种文件的目录路径的方法
iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app,Library. (NSHomeDirectory ...
- iOS中的UIView
2019独角兽企业重金招聘Python工程师标准>>> UIView UIView的位置 - (void)viewDidLoad {[super viewDidLoad];//新建三 ...
- (转)IOS中获取各种文件的目录路径的方法
iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么.documents,tmp,app,Library.(NSHomeDirectory() ...
- ios中获取各种文件的目录路径方法
2019独角兽企业重金招聘Python工程师标准>>> iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. docume ...
- iOS中获取相册、相机、定位、以及麦克风权限设置
1.判断用户是否获取了相册的访问权限 #import <AssetsLibrary/AssetsLibrary.h>// 获取相册权限 - (void)getPhotoLibraryAut ...
- iOS中的UIView的基本属性1
@interface AppDelegate ()@end@implementation AppDelegate- (BOOL)application:(UIApplication *)applica ...
最新文章
- Python闭包及其作用域
- cass软件yy命令_WIN10系统中的CASS字体问题
- 如何在多台web服务器上共享session?
- 选择大公司还是小公司
- Anroid View事件响应机制和ViewGroup的事件响应分发机制
- 系统分析师资料_软考 系统分析师考试通过总结
- 在WPF中开启摄像头扫描二维码(Media+Zxing)
- python 通达信函数_python调用通达信公式,大智慧公式转python
- OpenKG开源系列 | 轻量级知识图谱抽取开源工具OpenUE
- mysql 1548_MySQL创建函数由于Error 1548失败
- Vue # Avoid mutating a prop directly since the value will be overwritten wheneve
- 物联网云平台应用于远程污水在线检测
- ubuntu 14.04 wifi peap 选择证书问题
- 计算机三级网络技术最全知识点总结【5】
- ov2604寄存器配置
- webgl-原生纹理贴图
- DIP,QFP,PFP,PGA,BGA封装介绍
- 英飞凌XMC系列单片机教程 第一章,开发环境的搭建
- psd文件生产html,PSD文件切图制作html全过程记录
- 抓取网页(3)之部分工程文件
热门文章
- paip.Java Annotation注解的作用and 使用
- Rust : 高富帅的match
- 企业如何高效用云?| 资深运维架构师细说云架构下的运维体系构建
- 农业银行网银兼容银河麒麟软件操作系统试点成功
- OpenStack Queens版本Security项目介绍
- 【路径规划】基于matlab帝国企鹅算法求解机器人栅格地图避障路径规划问题【含Matlab源码 784期】
- 【数学建模】基于matlab GUI弱肉强食问题—Volterra 模型【含Matlab源码 1502期】
- 【优化算法】动态粒子群算法的动态环境寻优算法【含Matlab源码 1125期】
- 【人脸表情识别】基于matlab GUI CNN人脸表情识别【含Matlab源码 787期】
- 【CVRP】基于matlab节约算法求解带容量的车辆路径规划问题【含Matalb源码 157期】