IOS View编程指南笔记
我们所示程序
对于一切IOS APP来说。我们看的的内容,都是UIView所呈现的。
UIView如场景,UIWindow如舞台。UIView粉墨登场在UIWindow这个舞台上,使我们看到丰富多彩的界面UI。
UIWindow本身没有不论什么内容,它仅仅提供了一个场所来让这些UIView来显示。切换。
通常。一个APP仅有一个UIWindow作为显示的场所。当我们要进行多屏显示时。才会使用到多个UIWindow。
UIView的基本结构
1、UIView附着于UIWindow上。仅仅有放在UIWindow上的View,才干被我们看到。
2、UIView本身又可作为容器显示并管理SubView,使界面更丰富。
3、每一个UIView都有一个相应的Core Animation Layer类对象作支持。Layer类对象通常是CALayer类对象。该对象存储相应UIView对象的一些信息数据,并处理UIView的动画操作。
有了CALayer对象,主要会提供例如以下几点作用:
(1)CALayer对象存储了相应UIView对象的信息数据。这能够使UIView的渲染次数大大降低,我们能够尽可能的直接读取CALayer对象里面的存储的已经渲染过的数据。而不须要每次都要渲染UIView。
(2)正是由于CALayer对象存储了UIView的信息。才使得UIView的当前内容能够被操作,进而实现UIView的动画效果。
(3)我们能够通过直接操作CALayer对象来实现更丰富灵活的显示及动画效果。
UIWindow, UIView, Core Animation Layer对象关系例如以下图所看到的:
View的等级及SubView的管理
如前所述。UIView能够加入子View,进而形成superView,subView这种父子逻辑关系。
subView被父View放到一个子View队列里面进行管理。
view显示的层级关系
最后增加的view会遮挡前面的view。
事件响应链(Event
responder chain)
当App获取到用户的操作事件后。会首先将该event传递给发生该事件最上层的subview。若该subview不响应该事件,则会传递至该view的superview进行响应。这样一直传递下去。直到该事件被响应或由程序丢弃不处理为止。这就是所谓的Event responder chain。
View的内容绘制周期
在IOS中,UIView类採取一种按需策略来绘制View的显示内容。
所谓按需策略,就是指仅当你明白告知系统须要对View进行内容重绘时,系统才会调用你的绘制函数又一次绘制VIew的内容,否则。系统在大多数情况下仅使用View的内容快照图片来取代View的内容显示。
详细实现例如以下:
1、当一个View第一次显示在屏幕时。系统会自己主动调用View的绘制函数,完毕内容显示。同一时候。为内容保留一份快照图片。
2、若View的内容不发生改变,则在大多数情况下,系统仅使用快照图片来表示View内容。这里注意,系统不会主动询问是否View的内容发生了改变,须要你主动通知系统内容发生改变从而更新View显示内容。
3、当你对View的内容做出了改变,调用
setNeedsDisplay or setNeedsDisplayInRect:
方法通知系统内容发生改变,须要重绘View界面。
4、系统得知内容发生改变后,不会马上重绘View界面,而是当这轮run loop结束,准备重绘内容时,才会对改变内容的View进行重绘。
5、当系统对View进行重绘时,流程并非统一的。
对于自己定义的View而言,我们须要重写
drawRect: 方法。
当然。也能够通过直接改变View相应的Layer对象的方式来改变View的内容。
6、当系统完毕对View的重绘后。会採集一张新的内容快照来代表View的内容来用作多数时间的View显示。
注意。一般的View的几何形变(如拉伸缩小,不会引起内容重绘,而不过内容快照的拉伸缩小)。
View的内容模式
如前所述,当View显示在屏幕上后。系统会用一张快照来取代表示内容。
这会照成这么一种情况。当我们更改View的frame等属性时。其内容(内容快照),并不一定会同一时候改变。对于内容显示的方式。取决于UIView对象的Content
Modes.默认的系统会採取UIViewContentModeScaleToFill模式,使内容快照拉伸填充满整个View区域。
Content
Mode的几个形式例如以下图:
注意,当设置了View的ContentMode后,每一次View的几何形变都会引起系统调用View的drawRect:方法来重绘View。因此应当避免使用该属性,同一时候对于系统View,我们绝不应该用属性。
View的坐标系统
IOS系统的坐标系统例如以下所看到的:
UIWindow。 UIView都有自己的坐标系统。
对于UIView经常使用的属性Frame,Bound,Center其属性是相对于不同坐标系统的。详细例如以下:
A view object tracks its size and location using its frame, bounds, and center properties:
The
frameproperty
contains the frame rectangle, which specifies the size and location of the view in its superview’s coordinate system.The
boundsproperty
contains the bounds rectangle, which specifies the size of the view (and its content origin) in the view’s own local coordinate system.The
centerproperty
contains the known center point of the view in the superview’s coordinate system.
而bounds属性。则是对其自己的坐标系统来说的。
对于位移运动,推荐改变Center属性来实现,由于Frame属性在一些变形中是不存在的。
When you set the
frameproperty, the size value in theboundsproperty
changes to match the new size of the frame rectangle. The value in thecenterproperty similarly changes to match the new center point of the frame rectangle.When you set the
centerproperty, the origin value in theframechanges
accordingly.When you set the size of the
boundsproperty, the size value in theframeproperty
changes to match the new size of the bounds rectangle.
View的Runtime交互模型
- 调用
setNeedsLayout方法。让系统又一次布局(即让系统在下一轮更新过程中,主动调用我们重写的layoutSubviews) - 调用
setNeedsDisplayorsetNeedsDisplayInRect:方法,让系统对View内容进行重绘。(即让系统在下一轮内容更新过程中。主动调用我们重写的
drawRect:)函数。 - 更改UIView的属性,或通知某个controller对象。
关于View使用的Tips
尽管对UIControl加入自己的subview技术是可行的,但这么做是危急的。由于当Apple更新版本号时,UIControl对象的实现细节可能会改变,而导致我们加入了subview的程序执行失败。
IOS View编程指南笔记的更多相关文章
- iOS多线程编程指南
iOS多线程编程指南(拓展篇)(1) 一.Cocoa 在Cocoa上面使用多线程的指南包括以下这些: (1)不可改变的对象一般是线程安全的.一旦你创建了它们,你可以把这些对象在线程间安全的传递.另一方 ...
- (译)IOS block编程指南 1 介绍
Introduction(介绍) Block objects are a C-level syntactic and runtime feature. They are similar to stan ...
- iOS ---Extension编程指南
当iOS 8.0和OS X v10.10发布后,一个全新的概念出现在我们眼前,那就是应用扩展.顾名思义,应用扩展允许开发者扩展应用的自定义功能和内容,能够让用户在使用其他app时使用该项功能.你可以开 ...
- iOS多线程编程指南(二)线程管理
当应用程序生成一个新的线程的时候,该线程变成应用程序进程空间内的一个实体.每个线程都拥有它自己的执行堆栈,由内核调度独立的运行时间片.一个线程可以和其他线程或其他进程通信,执行I/O操作,甚至执行任何 ...
- 编程基础-msdn编程指南笔记
此博仅为笔记,摘自msdn编程指南文档,链接地址:http://msdn.microsoft.com/zh-cn/library/67ef8sbd.aspx 注释:// 单行注释 /* 多行注释*/ ...
- iOS多线程编程指南(一)关于多线程编程(转)
原文:http://www.dreamingwish.com/article/ios-multi-threaded-programming-a-multi-threaded-programming.h ...
- C++/C高质量编程指南-笔记
复习: C/C++高质量编程指南: [规则1-2-1]为了防止头文件被重复引用,应当用ifndef/define/endif结构产生预处理块. [规则1-2-2]用 #include <file ...
- View Programming Guide for iOS ---- iOS 视图编程指南(一)
Next About Windows and Views 关于窗口和视图 In iOS, you use windows and views to present your application’s ...
- View Programming Guide for iOS ---- iOS 视图编程指南(四)---Views
Views Because view objects are the main way your application interacts with the user, they have many ...
随机推荐
- uiviewcontroller顶级布局控制
@available(iOS 7.0, *) open var edgesForExtendedLayout: UIRectEdge // Defaults to UIRectEdgeAll @ava ...
- DNS隧道之DNS2TCP使用心得教程——是可以用来穿透qiang的,ubuntu下直接apt install dns2tcp
DNS隧道之DNS2TCP使用心得教程 转自:http://blog.creke.net/750.html DNS2TCP是在上次DNS隧道大检阅时提到的一个DNS隧道. 在2010年6月的更新(也是 ...
- 面包屑 asp代码记录 newsmulu_class 内部函数
'id 这里其实是 classId 'mbStr1 最右边的栏目模板 由于是当前本页面 就不带链接了 建议默认值:<span class='mbxC'>$title</span> ...
- CAD参数绘制对齐标注(com接口)
主要用到函数说明: _DMxDrawX::DrawDimAligned 绘制一个对齐标注.详细说明如下: 参数 说明 DOUBLE dExtLine1PointX 第一条界线开始点X值 DOUBLE ...
- vue工程化之去除Eslint验证
有的时候用vue-cli创建好项目之后,写代码时会出现换行和空格报错,出现这么写错误是什么原因呢? 相信第一次接触时有点摸不着头脑.其实是在你用vue-cli脚手架构建项目时用了ESLint代码检查工 ...
- 四种方案解决ScrollView嵌套ListView问题 [复制链接]
以下文章转自@安卓泡面 在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollVie ...
- vue 全局组件的注册
第一步 在main.js里面 引入需要注册的组件例如: //引入组件 import header from './components/header.vue' import footer from ...
- [Python3网络爬虫开发实战] 7.1-Selenium的使用
Selenium是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作,如点击.下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码,做到可见即可爬.对于一些JavaScript动态渲染的页面来说 ...
- 零基础入门学习Python(21)--函数:lambda表达式
知识点 lambda 表达式 Python 允许使用lambda关键字创建匿名函数 lambda 函数怎么使用? 单个参数 >>> def add(x): return 2*x + ...
- Python基础(十)re模块
Python基础阶段快到一段落,下面会陆续来介绍python面向对象的编程,今天主要是补充几个知识点,下面开始今天的内容. 一.反射 反射的作用就是列出对象的所有属性和方法,反射就是告诉我们,这个对象 ...