转自:http://bj007.blog.51cto.com/1701577/541572

在界面设计中,最终用户看到的呈现通常是由不同层的视图组成的,通过控制视图的层次就可以实现不同的效果和功能。而视图的层次也通常被称为Z-Order或者Z-Index(如下图)。在很多UI库中,一个视图的Z-Order通常都是通过自身相关的一些接口实现,但iPhone为了细分视图中父控件和子控件之间的责任,将这部分功能划分到了父控件实现。这样如果要将一个视图置于最上面,原来可能只需要view.bringToFront(),在iPhone中就需要 view.superView.bringToFront(view)。这样的间接让一部分人(包括我自己)感觉到不习惯,为此我们可以给UIView添加一个Z-Order相关的Category以避免了这种间接,这样我们就可以用我们习惯的方式来控制视图的Z-Order了。

UIView的Z-Order Category的代码如下:

声明:

@interface UIView (Z-Order)

-(int)getSubviewIndex;

-(void)bringToFront; 
-(void)sendToBack;

-(void)bringOneLevelUp; 
-(void)sendOneLevelDown;

-(BOOL)isInFront; 
-(BOOL)isAtBack;

-(void)swapDepthsWithView:(UIView*)swapView;

@end

实现:

@implementation UIView(Z-Order)

-(int)getSubviewIndex 

    return [self.superview.subviews indexOfObject:self]; 
}

-(void)bringToFront 

    [self.superview bringSubviewToFront:self]; 
}

-(void)sendToBack 

    [self.superview sendSubviewToBack:self]; 
}

-(void)bringOneLevelUp 

    int currentIndex = [self getSubviewIndex]; 
    [self.superview exchangeSubviewAtIndex:currentIndex withSubviewAtIndex:currentIndex+1]; 
}

-(void)sendOneLevelDown 

    int currentIndex = [self getSubviewIndex]; 
    [self.superview exchangeSubviewAtIndex:currentIndex withSubviewAtIndex:currentIndex-1]; 
}

-(BOOL)isInFront 

    return ([self.superview.subviews lastObject]==self); 
}

-(BOOL)isAtBack 

    return ([self.superview.subviews objectAtIndex:0]==self); 
}

-(void)swapDepthsWithView:(UIView*)swapView 

    [self.superview exchangeSubviewAtIndex:[self getSubviewIndex] withSubviewAtIndex:[swapView getSubviewIndex]]; 
}

@end

iPhone How-to:如何调整UIView的Z-Order的更多相关文章

  1. 自定义经纬度索引(非RTree、Morton Code[z order curve]、Geohash的方式)

    自定义经纬度索引(非RTree.Morton Code[z order curve].Geohash的方式) Custom Indexing for Latitude-Longitude Data 网 ...

  2. Z Order of Controls in Delphi VCL

    Get and set the Z Order of controls at runtime in Delphi VCL. If you are looking for a FireMonkey so ...

  3. Z Order of Controls in Delphi FireMonkey(Tom Yu的博客)

    Get and set the Z Order of controls at runtime in Delphi FireMonkey. This is a follow on to my earli ...

  4. Z Order(Copy From WIN32.HLP)

    The Z order of a window indicates the window's position in a stack of overlapping windows. This wind ...

  5. iPhone与iPad开发实战读书笔记

    iPhone开发一些读书笔记 手机应用分类1.教育工具2.生活工具3.社交应用4.定位工具5.游戏6.报纸和杂志的阅读器7.移动办公应用8.财经工具9.手机购物应用10.风景区相关应用11.旅游相关的 ...

  6. [转] 关于UIView

    [转载] 原文地址 :http://blog.csdn.net/itianyi/article/details/8982518 UIView是开发中使用得最多的控件了,深入的理解很有必要. UIVie ...

  7. IOS开发-CALayer和UIView详细汇总

    1.    CALayer和UIView之间的关系: 在iOS系统中,你能看得见摸得着的东西基本上都是UIView,比如UI控件.图标等等,都是UIView. 其实UIView之所以能显示在屏幕上,完 ...

  8. Android窗口管理服务WindowManagerService计算窗口Z轴位置的过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8570428 通过前面几篇文章的学习,我们知道了 ...

  9. CALayer & UIView 关系浅析

    原文链接:http://www.jianshu.com/p/8e6a313c158e 一.CALayer和UIView的关系 UIView显示在屏幕上归功于CALayer 可以说:UIView依赖CA ...

随机推荐

  1. mysql中避免使用保留字和关键字做列的名字

    设计数据表时,应尽量避免使用MySQL的关键字和保留字作为表名或列名. 比如key和keys为保留字,如果不小心使用关键字或者保留字作为列名字,执行下面的语句会出现语法错误: select * fro ...

  2. iOS网络编程解析协议三:JSON数据传输解析

    作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式 基于JavaScript的一个子集 易读性略差,编码手写难度大,数据量小 JSON格式取代了XML给网络传输带来了很大的便利, ...

  3. Resin install document

    Centos6快速安装文档 resin3.1.13 软件下载地址: http://caucho.com/products/resin/download/gpl#download #系统环境[root@ ...

  4. STM32F103 GU906B模块GPRS、短信收发、拨号等功能的实现

    这个程序搞了我很久,尤其是对如何提高响应速度上,程序流程很简单,大概就是: 发送AT指令->等待模块响应->一旦响应了,立即返回,并处理掉. 这个程序不一定只能用在GU906上,程序框架在 ...

  5. drawable和values的加载规则

    Google搞了一大套hdpi.xhdpi之类的这些东西,简单说来,就是为了让我们轻松实现"与设备密度无关的视觉大小一致性",注意这里的"视觉大小一致性",就是 ...

  6. Chrome 制作绿色便携版

    1.建立一个新的文件夹命名为Chrome 2.将电脑上默认的Chrome文件复制到新的文件夹Chrome里包含安装文件和Chrome数据文件     Chrome数据文件一般在"C:\Use ...

  7. TCP协议中的SO_LINGER选项

    TCP协议中的SO_LINGER选项 SO_LINGER选项用来设置延迟关闭的时间,等待套接字发送缓冲区中的数据发送完成.没有设置该选项时,在调用close()后,在发送完FIN后会立即进行一些清理工 ...

  8. nginx-rtmp流媒体服务器搭建【转】

    nginx-rtmp https://github.com/pengqiuyuan/nginx-rtmp nginx-rtmp 流媒体服务器的搭建(采集桌面,手机直播) 在线Demo,直播自己的pc机 ...

  9. 使用poll处理任意数目个客户的单进程程序

    将http://www.cnblogs.com/nufangrensheng/p/3590002.html中的select改用poll. int main(int argc, char **argv) ...

  10. Unity3D游戏开发之SQLite让数据库开发更简单

    各位朋友大家好.欢迎大家关注我的博客,我是秦元培,我是博客地址是http://blog.csdn.net/qinyuanpei.在经历了一段时间的忙碌后,博主最终有时间来研究新的东西啦,今天博客向和大 ...