UIView

UIView 学习

概述

在IOS中使用window和view来展现应用程序的内容。windows是不可见的部分但是它提供了一个基本的容器用来放置程序的视图(view)。每一个app都至少包含一个window以及一个view来展现该app的内容。UIKit和其他系统框架也提供了大量预先设计好的视图共开发人员使用。

view架构原理

在IOS中一切在屏幕上能看见的东西都离不开UIView这个类,UIView是一个矩形的区域,他专门处理绘制图像,处理touch事件。每一个都视图(view)与一个动画层紧密配合,动画层主要负责在视图上渲染和生成动画。当我们需要控制动画的时候我们可以直接操作动画层。
动画层在UIVIew中的声明: @property(nonatomic, readonly, retain)  CALayer  *layer
UIview与动画层的关系如下图:

视图的绘制周期

当视图第一次出现在屏幕上系统会要求他绘制他的内容,系统会为他的内容建立一个快照并用这个快照作为可视化的图形界面,如果不改变视图的内容那么绘制函数永远也不会再被调用。当你改变了view的内容的时候应该调用setNeedsDisplay或者setNeedsDisplayInRect,这两个方法会通知系统去重绘界面。要注意的是当改变view的几何形状时是不会自动引起系统对界面的重新绘制。

Content Modes

当视图第一次被展现的时候系统会渲染view的内容并生成一个位图,之后如果视图发生了几何型的变化那么系统不会去重新绘制那个bitmap,取而代之的是用contentMode
 这个属性来决定这个bitmap应该被放缩还是从一个角落滑到另一个角落。
contentMode通常会被设置为UIViewContentModeScaleToFill,这个值是的视图的内容被缩放至frame的大小。下图是相关参数的作用:
Content mode comparisons

视图的几何属性以及坐标系

坐标系:
View coordinate system

Frame Bounds Center 属性之间的关系

frame 属性使用来描述该视图在父视图坐标系中的位置以及大小。
bounds属性用来描述视图的大小以及自己的坐标系系统。
center属性用来描述视图中心点在父视图中的坐标。
Relationship between a view's frame and bounds

视图运行时交互

任何时候用户与你的界面进行交互的时候,一系列复杂的事件就会在UIKit中产生并处理。在这里有一个特殊的情况会在一系列事件发生后产生UIKit会调用你的view Class然后给他一个响应该事件的机会。理解了这些调出点才能够更好的将你的视图与系统融合在一起。下图展示了一个基本的事件序列——从用户开始触摸屏幕到屏幕更新画面。
UIKit interactions with your view objects
1.用户点击屏幕。
2.硬件向UIKit framwork汇报触摸事件。
3.UIKit framework将硬件传来的信号封装为UIEvent的对象,然后将该对象分发到合适的视图中(分发的详细过程参考上一节中的Responder Chain)
4.调用你实现在view中写好的处理这些事件的代码来处理UIEvent对象。
5.无论什么原因只要视图的几何结构发生改变那么UIKit就要来更新他的子视图,下面是跟新子视图的两条规则:
a.如果你在视图配置中选择了autoresizing选项那么UIKit将会根据一些特定的规则来调整每一个该视图的子视图。(详细规则见 Handling Layout Changes Automatically Using Autoresizing Rules.
b.如果在view中是想了layoutSubviews方法,那么UIKit将会调用它
你可以在你自定义的view里重写这个方法,用它来调整任何子视图的位置大小。举一个例子一个视图提供了一个非常大的可滚动的区域,这个区域里最好放的是一些子视图以拼接成一个大的视图,而不是直接放一个大的视图,要不然内存会是一个非常头疼的问题。在实现这个方法的时候应该隐藏那些在屏幕以外的视图或者是重新定位那些在屏幕外的视图让他们以新的视图展现在屏幕上。
6.如果视图中的每一个部分都被标记为重绘那么UIKit会要求该视图重新绘制他自己。
对于自定义视图,尤其是定义了drawRect方法的视图而言,UIKit一定会调用该方法。当你实现该方法的时候应当在视图的特定区域里尽可能快地进行重绘并且别无选择,不要在这个地方做任何附加层的改变,不要在这里更改你的数据模型。这个方法的主要意图是更新视图的可视化内容。
标准的系统视图一般是不会实现drawRect方法的,取而代之的是在这个时候去管理他们的绘制。
7.任何的视图更新都是由compositor这个模块将视图的信息交给硬件来展现。
8.应将模块将信息翻译并送到屏幕上去。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值