UIView

1.什么叫UIView?

视图。在iPhone里看到的,摸到的都是UIView。每个UI控件都继承了UIView 视图和窗口展示了应用的用户界面,同时负责界面的交互,大部分你想要的可视化操作都是由视图对象-即UIView类的实例来进行的。

视图与Core Animation层联合起来处理着属兔内容的解释和动画过度,每个UIKit框架里的视图都被一个层的对象支持(通常是一个CALayer类的实例),它管理着后台的视图存储和处理视图相关的动画。然而,当你需要对视图的解释和动画行为有更多的控制权时,你可以使用层。

2.UIView与UIWindow的联系

UIWindow是一种特殊的UIView,通常在一个App中只会有一个UIWindow。iOS程序启动后,创建的第一个就是视图控件UIWindow,接着创建控制器的view,接着将控制器的view添加到UIWindow上,这样控制器的view就能显示到屏幕上了。

UIWindow是创建的第一个视图控件,创建的第一个对象是UIAppliation

3.UIView的生命周期

到目前为止,我们已经了解了每个方法的作用,接下来就把整个流程梳理一遍。

-[ViewController initWithCoder:]或-[ViewController initWithNibName:Bundle]:首先从归档文件中加载UIViewController对象。即使是纯代码,也会把nil作为参数传给后者。

-[UIView awakeFromNib]:作为第一个方法的助手,方便处理一些额外的设置。

-[ViewController loadView]:创建或加载一个view并把它赋值给UIViewController的view属性

-[ViewController viewDidLoad]:此时整个视图层次(view hierarchy)已经被放到内存中,可以移除一些视图,修改约束,加载数据等

-[ViewController viewWillAppear:]:视图加载完成,并即将显示在屏幕上,还没有设置动画,可以改变当前屏幕方向或状态栏的风格等。

-[ViewController viewWillLayoutSubviews]:即将开始子视图位置布局

-[ViewController viewDidLayoutSubviews]:用于通知视图的位置布局已经完成

-[ViewController viewDidAppear:]:视图已经展示在屏幕上,可以对视图做一些关于展示效果方面的修改。

-[ViewController viewWillDisappear:]:视图即将消失

-[ViewController viewDidDisappear:]:视图已经消失

如果考虑UIViewController可能在某个时刻释放整个view。那么再次加载视图时显然会从步骤3开始。因为此时的UIViewController对象依然存在。

4.UIView和CALayer的区别联系

view是对layer的一种封装,你对view的很多操作事实上是对layer的操作,之所以会出现这两个东西是因为

1、首先UIView可以响应事件,Layer不可以.

view支持很多手势的交互,你所操作iphone的各种点击,拖动等等。

2、layer来至于mac os,是可以跨平台的东西。这里就是个很要学问的东西,系统的可变部分和不可变部分,可变部分越多,系统越不稳定,但是功能就更加丰富。layer就是作为一种不可变的东西存在,view作为一种可变的东西存在,所有我们每次在ios更新时候获得了大量的view新特性,但是整个view系统底层很多东西依旧可以接着使用,各种动画等。这就是分开view和layer的功劳。

UIKit使用UIResponder作为响应对象,来响应系统传递过来的事件并进行处理。UIApplication、UIViewController、UIView、和所有从UIView派生出来的UIKit类(包括UIWindow)都直接或间接地继承自UIResponder类。在UIResponder中定义了处理各种事件和事件传递的接口。而CALayer直接继承NSObject,并没有相应的处理事件的接口。

总结如下几点:

每个 UIView 内部都有一个 CALayer 在背后提供内容的绘制和显示,并且 UIView 的尺寸样式都由内部的 Layer 所提供。两者都有树状层级结构,layer 内部有 SubLayers,View 内部有 SubViews.但是 Layer 比 View 多了个AnchorPoint

在 View显示的时候,UIView 做为 Layer 的 CALayerDelegate,View 的显示内容由内部的 CALayer 的 display

CALayer 是默认修改属性支持隐式动画的,在给 UIView 的 Layer 做动画的时候,View 作为 Layer 的代理,Layer 通过 actionForLayer:forKey:向 View请求相应的 action(动画行为)

layer 内部维护着三分 layer tree,分别是 presentLayer Tree(动画树),modeLayer Tree(模型树), Render Tree (渲染树),在做 iOS动画的时候,我们修改动画的属性,在动画的其实是 Layer 的 presentLayer的属性值,而最终展示在界面上的其实是提供 View的modelLayer

两者最明显的区别是 View可以接受并处理事件,而 Layer 不可以

UIView属性:

frame - 你可以使用这个来动画的改变视图的尺寸和位置

bounds - 使用这个可以动画的改变视图的尺寸

center - 使用这个可以动画的改变视图的位置,定义控件的中心点

transform - 使用这个可以翻转或者放缩视图

alpha - 使用这个可以改变视图的透明度

backgroundColor - 使用这个可以改变视图的背景颜色

contentStretch - 使用这个可以改变视图内容如何拉伸

tag - 可以定义控件的标识,它既可以定义控件的位置,也可以定义控件的大小

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容