在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

时间: 2024-10-06 19:08:40

在iOS中获取UIView的所有层级结构 相关的相关文章

iOS-获取UIView的所有层级结构

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

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

转自:http://blog.sina.com.cn/s/blog_5fb39f910101di92.html IOS中获取各种文件的目录路径的方法 iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app,Library. (NSHomeDirectory()), 手动保存的文件在documents文件里 Nsuserdefaults保存的文件在tmp文件夹里 1.Documents 目录:您应该将所有

IOS中获取各种文件的目录路径的方法

iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app,Library. (NSHomeDirectory()), 手动保存的文件在documents文件里 Nsuserdefaults保存的文件在tmp文件夹里 1.Documents 目录:您应该将所有de应用程序数据文件写入到这个目录下.这个目录用于存储用户数据或其它应该定期备份的信息. 2.AppName.app 目录:这是应用程序的程序包目录,

ArcGIS Runtime SDK for iOS中获取ImageServiceLayer的栅格值

本文原创,转载请注明原创地址 http://blog.csdn.net/dongyu1009/article/details/37697389 用AGSImageServiceIdentifyTask可以获取ArcGISImageServiceLayer图层中的栅格值.这涉及了三个比较重要的类:AGSImageServiceIdentifyParameters.AGSImageServiceIdentifyTask和AGSImageServiceIdentifyResult,还有一个delega

使用Accessibility Inspector来检测IOS APP中控件元素的层级结构

Accessibility Inspector是xcode中自带的一个检测工具, 可以非常方便快速地获取IOS APP中各个控件元素的层级结构. 利用该层级结构, 我们可以在UIAutomation中实现相应的自动化了. 在Xcode->Open Developer Tool->Accessibility Inspector打开该工具, 该工具需要在Mac的安全性与隐私里边设置辅助功能的权限, 即允许该工具控制电脑. 打开后,会发现该检测工具会一直悬浮在屏幕的最前端, 且能够检测到电脑屏幕上的

iOS中自定义UIView(用接口获取Lable和TextFile中的值)

NSArray *arrayText = @[@"用户名",@"密码",@"确认密码",@"手机号",@"邮箱"]; NSArray *placeholders = @[@"请输入用户名",@"请输入密码",@"请确认密码",@"请输入手机号",@"请输入邮箱"]; NSInteger y = 30; for

iOS中获取UIWebView的各种信息

stringByEvaluatingJavaScriptFromString 使用stringByEvaluatingJavaScriptFromString方法,需要等UIWebView中的页面加载完成之后去调用.我们在界面上拖放一个UIWebView控件.在Load中将googlemobile加载到这个控件中,代码如下: // 记得遵守UIWebView的代理 1. - (void)viewDidLoad 2. { 3. [super viewDidLoad]; 4. webview.bac

iOS中的UIView的基本属性

#import "AppDelegate.h" @interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UI

iOS中获取本地通讯录联系人以及汉字首字母排序

/***  加载本地联系人*/ - (void)loadLocalContacts { //新建一个通讯录类 ABAddressBookRef addressBooks = nil; if (DeviceVersion < 6.0) { addressBooks = ABAddressBookCreate(); } else { addressBooks =  ABAddressBookCreateWithOptions(NULL, NULL); //获取通讯录权限 dispatch_semap