03.subview_and_superview

Subview and Superview

作者:PMST

文章:Views - Subview and Superview

系列:The Swift Beginner

写于:2015.04.27

正文

在很久以前,苹果公司的视图绘制机制和现在是大相径庭。那时任何一个视图拥有自己的“私人领地”——精确来说就是一个矩形。假如某个非该视图的subview想要呈现其中,这是不被允许的!因为当视图重绘(redraw)矩形区域时,会擦除所有不属于自己的内容;相应地,属于该视图的subview内容只允许在指定的矩形区域内绘制,想要“越狱”(将内容绘制到矩形框外)出去,没门!

而从OS X 10.5开始,这些条条框框都已经被废除了。目前苹果公司给出的视图绘制机制,完全摒弃了先前的那些限制。而值得庆幸的是iOS绘图就是基于新的架构!在iOS中,任何一个subview都允许从superview“越狱出去”,这意味着,打破了矩形区域的限制,子视图绘画面积不仅仅只是那么一小片区域,而是整个!此外其他视图(不属于superviewviews)能够覆盖别的视图,这在以前是不被允许的。

下面给出一个小demo,下图显示了三个相互重叠的视图。为了更直观地观看,给三个视图的背景上了色。现在问题来了,你无从得知三个视图之间的关系,比如:三个视图是相互独立?谁是谁的子视图?谁和谁是同级的?

事实上,三者的关系是这样的:

  • 粉色视图和红色视图是同级关系
  • 绿色视图是粉色视图的子视图

storyboard中,拖拉两个viewmain view中,分别设置背景颜色为粉色和红色;然后再次拖拽一个view到粉色视图中,设其背景颜色为绿色;现在打开nib editor查看视图层级设置。

小技巧:当你的应用程序在运行时想要查看视图层级关系,选择 Debug->View Debugging-> Capture View Hierarchy

关于视图在视图层级中的摆放位置是非常有讲究了,这也决定了视图的绘制顺序!

  • 相同层级的视图(属于同一个superView)绘制顺序是固定的:自上而下,只有当前者绘制完毕,才进行下一个视图绘制。特殊情况:假如后者绘制区域和前者有重叠,那么就会造成覆盖现象,前者视图呈现在后者视图之后。
  • 先绘制superview,在绘制属于父视图的subview

结合本文第一幅图进行绘制顺序讲解,粉色视图和红色视图为同一级,同属于父视图main view;粉色视图在前,红色视图为后,因此首先绘制粉色视图;粉色视图包含绿色子视图,当粉色视图绘制完毕,接下来是绘制绿色视图(注意:同级视图之间,前者所有视图,包括子视图全部绘制完毕,才进行下一个视图);最后是绘制红色视图,显然它会覆盖粉色以及绿色视图。

storyboard中设置层级关系

选中main.storyboard,左侧会罗列出所有视图场景,各视图层级关系一览无余。现在选中一个粉色视图,Editor-> Arrange -> Send Forward(其他还有 Send to Front,Send to Back,Send Backward),操作结果会把粉色视图下移到红色视图之下,意味着粉色视图在最前面,红色视图放置到最底下被遮盖。

补充一点视图层级的知识。

  • 当子视图从父视图中移除,子视图下的所有视图也将被移除;当子视图在父视图中移动位置,其下所有视图也跟着移动。
  • 子视图会继承父视图的透明程度(degree of transparency),这个很有意思。
  • 子视图绘画区域可以超出父视图限定的矩形区域,但是!父视图有权利选择显示还是隐藏那些超出范围的内容!!即clipping,我们可以通过设置视图的clipsToBounds属性来决定显示还是隐藏。
  • 父视图可以拥有多个子视图,从内存管理意义上来说,更像是一组数组;采用引用方式关联每一个子视图;视图数组负责一些添加或移除的工作,当有新的子视图加入进来,相应地数组新增一个元素,相反有子视图从父视图移除,数组要删除对应的元素。
  • 父视图的尺寸大小改变时,在它其中的子视图将会自动调整大小。

继续说说视图(UIView),前文谈及它一个特性,只有一个父视图(superview)和多个子视图(an array of UIView,注:数组是有序的!),允许你从中追踪视图层级关系;从方法上来说,isDescendantOfView:方法能够确定一个视图是否是另外一个视图的子视图;当然你也可以选择使用引用方式来获得某个视图,比如通过oulet;最后,每一个视图都能够设置一个独一无二的标签——tag属性,通过数值大小来决定层级关系,这都取决你!

代码设置层级关系

使用代码手工设置视图层级关系非常简单。最为熟悉的便是addSubview:,为一个视图添加子视图;与之对应的removeFromSuperview:,则是从父视图中移除子视图,记住一旦移除意味着释放(released),假如你打算好之后还要重用它,那么就别移除掉,继续保持住!

iOS还提供了各种事件(Events)来通知视图动态变化。当然想要使用还是有条件限制的:一.视图必须有子视图;二.使用override来重写方法,具体有:

  • didAddSubview:, willRemoveSubview:
  • didMoveToSuperview, willMoveToSuperview:
  • didMoveToWindow, willMoveToWindow:

一旦addSubview:被调用,视图(将要添加为子视图的view)会被放置到superview的子视图中的最新一个,从层级关系上来说,自上而下,它是最下面一个!因此在绘制时,它作为压轴最后绘图,所有其他视图都是在它之下。

前面说到一个视图的子视图可以看做一个数组(array of UIView),它的索引号自然就是从0开始。当然iOS也提供了一系列方法允许你从一个指定的索引号插入视图,至于放在前面还是后面也是可以选择的!另外还提供了方法能够交换两个同级关系的视图。

  • insertSubview:atIndex:
  • insertSubview:belowSubview:,insterSubview:aboveSubview
  • exchangeSubviewAtIndex:withSubviewAtIndex:
  • bringSubviewToFront:,sendSubviewToBack:

不过iOS貌似没有提供移除所有子视图的方法,这个倒是有点让人诧异的,因此我们只能自己遍历视图数组,逐个删除。

for v in myView.subviews as UIView{
    v.removeFromSuperview()
}

恩…貌似这么写好low。那么换种方式:

    (myView.subviews as [UIView]).map{$0.removeFromSuperview()}
时间: 2024-11-10 15:46:50

03.subview_and_superview的相关文章

03 php 数据类型:整数,进制转换,浮点,字符,布尔,数组,空类型,类型转换,算术运算,比较运算

03 数据类型:整数,进制转换,浮点,字符,布尔,数组,空类型,类型转换, 算术运算,比较运算,逻辑运算,短路现象, 三目运算符,字符型运算: 数据类型 整体划分 标量类型: int, float, string, bool 复合类型: array,     object 特殊类型: null,     resouce 整数类型int, integer 3种整数表示法 十进制写法:123: $n1 = 123; 八进制写法: 0123 $n2 = 0123; 十六进制写法: 0x123 $n3

前端开发神器WebStorm--Grunt 搭建环境(03)

通过上一篇前端开发神器WebStorm--自动化工作流(前言),相信大家都Grunt自动化工具有了初步了解. 接下来我就以WROC3000 web为原型,演示一下如何使用Grunt工具提高工作效率,最大程度压缩代码. 1.首先安装node环境 进入官网 下载安装.(记住安装目录) 检测安装成功方法:打开CMD窗口,输入 node --version 会打印出安装的版本号,说明已经安装成功. 2.安装 Grunt 客户端 在CMD 窗口中,切换到node安装盘符,会自动切换到nodejs安装目录.

MyBatis笔记03

1.动态sql 01.if:单独使用if,后面必须有where 1=1 代码:<!-- 需要注意的事项:01. 在xml文件中 特殊字符的使用 &&必须换成 and或者 & < < > > <= <= >= >= ' &apos;" " 02.因为不确定用户输入的到底是哪个参数 所以 where 之后必须加上 1=1 而且 每个条件之前加上 and --> <select id="

Environmental.Science.Limited.ChemHELP.v2.03

Environmental.Science.Limited.ChemHELP.v2.03 VMGSIM.V9.0.46最新版流程模拟软件     chemhelp易于安装和设置(系统要求如下).在一台电脑上,化学制品可以从数据库中选择,输入他 们的全名,或者使用一个搜索,可以指定一个部分的化学名称,中国科学院或联合国的数字,欧共体或欧 共体指数,甚至是一个风险短语.可以为选定的化学物显示的数据包括索引编号.危险符号.芯片分类和 标签.风险短语.物理性质.同义词.以及更多.正如这表明,在数据库中的

UML大战需求分析——阅读笔记03

读<UML大战需求分析>有感03 状态机图和活动图在样子比较相似,但状态机图是用来为对象的状态及造成状态改变的事件建模.我们大二学习UML统一建模语言状态机图模块时了解到,UML的状态机图主要用于建立对象类或对象的动态行为模型,描述系统中某一个对象所经历的各个状态.引起状态或活动转移的事件,以及因状态或活动转移而伴随的动作.但在以前的学习过程中,我们并没有学到过"伪状态",后经查阅知:伪状态是指在一个状态机中具有状态的形式,同时具有特殊行为的顶点.它是一个瞬时状态,用于构造

条款03:尽可能使用const

01.顶层const和底层const char greeting[] = "Hello"; char* p = ; const char* p = greeting;   //const data,nonconst pointer char* const p = greeting;       //nonconst data,const pointer const char* const p = greeting; //const data,nonconst pointer.*的左右位

最新Burpsuite Pro v1.7.03 介绍和破解版下载

0x00 介绍 Burp Suite 是用于攻击web 应用程序的集成平台.它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程.所有的工具都共享一个能处理并显示HTTP 消息,持久性,认证,代理,日志,警报的一个强大的可扩展的框架. 0x01 特点: 1 2 3 4 5 6 7 8 9 10 11 1.Target(目标)——显示目标目录结构的的一个功能 2.Proxy(代理)——拦截HTTP/S的代理服务器,作为一个在浏览器和目标应用程序之间的中间人,允许你拦截,查看,

异步编程系列第03章 自己写异步代码

p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提高下英文,用我拙劣的英文翻译一些重要的部分,纯属娱乐,简单分享,保持学习,谨记谦虚. 如果你觉得这件事儿没意义翻译的又差,尽情的踩吧.如果你觉得值得鼓励,感谢留下你的赞,愿爱技术的园友们在今后每一次应该猛烈突破的时候,不选择知难而退.在每一次应该独立思考的时候,不选择随波逐流,应该全力以赴的时候,不选择尽力而

uboot.2016.03 在mini2440上norfalsh启动

本人有点懒惰,直接在smdk2410的基础上进行修改 (note :红色字体表示修改内容,蓝色字体表示增加内容) 1. 顶层的makefile 在247行 添加如下两条语句 :   ARCH :=arm     CROSS_COMPILE :=arm-linux- 2 修改始终频率 打开 u-boot-2016.03/arch/arm/cpu/arm920t/start.S 第77行 #if defined(CONFIG_S3C2410) #if defined(CONFIG_S3C2440)