转自: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. iphone自适应屏幕亮度_如何在iPhone或iPad上调整屏幕亮度

    iphone自适应屏幕亮度 Khamosh Pathak Khamosh Pathak Your iPhone or iPad is pretty good at automatically adju ...

  2. 全代码编写的iPhone界面源码1 UIView UILabel UIButton

    这个界面全部都是用代码编写的,其中并没有使用到图片.也没有使用Interface Builder和Storyboard. 如果要看源码请看这里: http://blog.sina.com.cn/s/b ...

  3. linux 窗口z order,wxPython窗口z-order设置

    使用wxpython写的界面程序其实也是可以设置Z-order的. 可以使用pywin32模块调用win32的API实现,使用方法不在赘述. 如果仅仅是想将窗口置顶(放在其他窗口上面,Z-order顶 ...

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

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

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

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

  6. iPhone 7 256GB版停售原因分析

    对于苹果来说,iPhone新版本发布后,旧款进行调整是理所应当的事情,所以iPhone 7各种被和谐也是情理之中的事情. 据美国媒体报道称,苹果在iPhone 8发布前就已经对iPhone 7进行了调 ...

  7. iPhone 14仅两款Pro版搭载A16芯片 另外两款继续使用A15

    3月14日消息,据国外媒体报道,在苹果的iPhone 12和iPhone 13系列手机中,基本款和高端版在摄像头.屏幕等多个方面存在明显区别,进而导致在价格方面也有较大的差距. 而在苹果产品预测方面有 ...

  8. 苹果可折叠iPhone有望在2023年推出 支持手写笔

    9月19日消息,据国外媒体报道,在三星华为等厂商推出多款可折叠的智能手机之后,外界也在关注目前高端智能手机市场霸主的苹果,会在何时推出可折叠iPhone. 对于可折叠iPhone,此前也曾有过报道.去 ...

  9. 苹果支付35亿元和解iPhone“降速门”:国内用户又被忽略了

    每逢新款iPhone发布,就到了旧款iPhone的速度变慢的时候,这已经是许多iPhone手机用户的共识了. 苹果自己也承认过,为了防止设备意外关机,为了保护设备,在必要时限制了某些旧型号iPhone ...

最新文章

  1. Mybatis源码阅读(三):结果集映射3.2 —— 嵌套映射
  2. Maven 建立父子项目和跨项目调用内容的步骤
  3. Windows “七大奇迹”:DNS Dynamic Updates 中的7个严重漏洞
  4. 如何成为Java开发工程师?
  5. BZOJ1938: [CROATIAN2010] ALADIN
  6. 用简单Mask分类实现语义分割、实例分割“大一统”!FacebookUIUC开源MaskFormer
  7. svn使用方法以及使用教程
  8. VC2012编译protobuf出错处理
  9. Linux dstat 监控工具
  10. 一种标准地图服务转矢量Shapefile方法
  11. Java数字转换大写
  12. 计算机的坚果云怎么删除,如何删除坚果云残留图标
  13. 急需你的意见:句子迷图文日签投票
  14. 华硕主板怎么进入bios
  15. 2022-10-17 环境映射
  16. 正常计算机的c盘空间多大,往往C盘剩余空间多少为宜
  17. 2021年如何低成本开启创业?
  18. Ubuntu18.04 realsenseD435i深度摄像头外参标定的问题
  19. 外贸电子商务网站的网络广告推广方案
  20. Linux系统小惊喜:开往2022虎年的小火车

热门文章

  1. platform平台工作原理
  2. Linux_Makefile模板
  3. maven netbeans 导入_Maven - NetBeans
  4. 【python教程入门学习】Python零基础入门爬虫项目
  5. linux终端运行pytorch,Linux虚拟机测试pytorch运行
  6. pb 修改数据窗口种指定字段位置_如何在PB数据窗口中修改数据---设置数据窗口的更新属性...
  7. gradle 指定springcloud 版本_SpringCloud微服务架构开发实战:实现服务注册与发现
  8. java中unknown source_java中GUI编程中的unknown source问题
  9. SPI通信协议:单片机spi通信接口什么意思,spi接口干什么用的?
  10. 硬件重要还是软件重要?一个人能同时学会吗?