在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-获取UIView的全部层级结构
在iOS中获取UIView的全部层级结构 应用场景 在实际 iOS 开发中,非常多时候都须要知道某个 UI 控件中包括哪些子控件,而且分清楚它们的层级结构和自个的 frame 以及 bounds ,以 ...
- IOS中获取各种文件的路径介绍及方法
IOS中获取各种文件的目录路径的方法 技术交流新QQ群:414971585 iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. docum ...
- iOS中获取本地通讯录联系人以及汉字首字母排序
iOS中获取手机通讯录中的联系人信息: /*** 加载本地联系人*/ - (void)loadLocalContacts { //新建一个通讯录类 ABAddressBookRef addressBo ...
- IOS中获取各个文件的目录路径的方法和NSFileManager类
转自:http://blog.sina.com.cn/s/blog_5fb39f910101di92.html IOS中获取各种文件的目录路径的方法 iphone沙箱模型的有四个文件夹,分别是什么,永 ...
- iOS中获取各种文件的目录路径的方法
我们的app在手机中存放的路径是:/var/mobile/Applications/4434-4453A-B453-4ADF535345ADAF344 后面的目录4434-4453A-B453-4AD ...
- iOS中获取cell中webview的内容尺寸
最近项目中遇到在cell中获取webView的内容的尺寸的需求 实现的思路其实很简单 就是通过执行js 获取尺寸即可 为了后面用着方便我直接封装了一个HTML的cell 起名就叫 STHTMLBase ...
- iOS 中 为UIView添加背景图片
创建UIImage的方法有两种: UIImage *image = [UIImageimageNamed:@"image.jpg"];//这种不释放内存,要缓存 NSString ...
- (转)IOS中获取各种文件的目录路径的方法
iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app,Library. (NSHomeDirectory ...
- IOS中获取文件路径的方法
iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app,Library. (NSHomeDirectory ...
随机推荐
- 如何在网页标题栏title加入logo图标?
打开某一个网页会在浏览器的标签栏处显示该网页的标题和图标,当网页被添加到收藏夹或者书签中时也会出现网页的图标,怎么在网页title左边显示网页的logo图标呢? 方法一(被动式): 制作一个ico格式 ...
- Zeppelin添加mysql解释器
安装Apache zeppelin 1 wget http://apache.fayea.com/zeppelin/zeppelin-0.6.2/zeppelin-0.6.2-bin-all.tgz ...
- createThread和_beginthreadex区别
摘自:http://blog.csdn.net/morewindows/article/details/7421759 CreateThread()函数是Windows提供的API接口,在C/C++语 ...
- WTL版本ACEdit控件,改写自MFC版,附带源码
自动完成是个很酷也很实用的功能,比如在浏览器地址栏输入几个字母,相关的记录就会在下拉框中陈列出来. 最近在做公司产品UI部分的改善,原版本是MFC做的,我决定用WTL,于是就遇到自动完成控件的问题.遍 ...
- iOS之网络编程
发送HTTP请求的方法 在HTTP/1.1协议中,定义了8种发送http请求的方法 GET.POST.OPTIONS.HEAD.PUT.DELETE.TRACE.CONNECT.PATCH 根据HTT ...
- Quicksum
Quicksum Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Subm ...
- HDU 5352 MZL's City
最小费用最大流,因为要控制字典序,网络流控制不好了...一直WA,所以用了费用流,时间早的费用大,时间晚的费用少. 构图: 建立一个超级源点和超级汇点.超级源点连向1操作,容量为K,费用为COST,然 ...
- linux时间同步,ntpd、ntpdate
linux时间同步,ntpd.ntpdate 在Windwos中,系统时间的设置很简单,界面操作,通俗易懂.而且设置后,重启,关机都没关系.系统时间会自动保存在Bios的时钟里面,启动计算机的时候,系 ...
- linux配置java环境变量(转)
linux配置java环境变量(详细) 一. 解压安装jdk 在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录, 执行命令 ./jdk-6u14-linux-i586. ...
- IntelliJ IDEA 7.0 正式版注册机代码
好神奇,第一次看见注册机的源代码,自己运行一下.可以是java IDE环境,也可以是配置好jdk的dos环境. 然后输入自己的用户名就可以获得相对应的注册码,输入到软件中即可. 仅供参考,请购买正版. ...