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 - 可以定义控件的标识,它既可以定义控件的位置,也可以定义控件的大小