在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版本适配时在此要作相应的版本判断,并进行处理。

 
 参考链接:
1.http://blog.csdn.net/software_notes/article/details/18262813
2.http://blog.csdn.net/chenyblog/article/details/44490659
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值