UIView的下列属性是可以动画的。
- @property frame
- @property bounds
- @property center
- @property transform
- @property alpha
- @property backgroundColor
- @property contentStretch
UIView 负责展示内容,构造UIVIEW层级。UIWindow不负责显示,他是UIView的容器。UIWIndow一旦创建就一直存在不变了。变化的是显示在里面的UIVIew。有比如,我们链接了外接显示屏,则会创建第二个UIWindow来表示它。
一个view对象表达了屏幕上的一个矩形区域,负责绘制和响应touch事件,同时可以包含子view完成view的层级表达。大多数我们都是使用UIView,但也可以自定义view.
UIKit的UIView都对应有一个CALayer对象,它是负责view内容的递交和动画的。在他后面是Core Animation rendering Object 和hardware buffer来表达屏幕的实际bits。
core animation layer object对于性能至关重要。绘制view的代码在被执行的时候,结果会被core animation缓存,在之后做重绘的时候,会直接从缓存获取。
坐标系变换:
如果想对整个UIView进行线性变换,通过修改transform属性。
如果想对部分UIView进行线性变换,在drawRect方法中通过修改Grpaphic Context。
可以通过修改transform属性实现动画,但是动画都是基于center的。
如何让View更有效:
除非必要,不要定制drawing行为
尽可能设置opaque属性为YES。这告诉UIKit在view后面的view是不需要递交绘制的,可以提高性能。
content mode尽量不要使用,这个会导致改UIView不断重绘。在其他模式下,一旦内容被绘制后,会做一个内容的快照,下次再展现UIVIew的内容的时候,不会再次调用Drawing代码,而是使用快照。如果需要重绘,则调用setNeedDisplay或者setNeedDisplayInRect方法,则在runloop的下一次执行时重绘。
滚动时调整drawing行为,例如降低显示质量,等停止滚动再调整回来。
不要UIControl中添加subview,只对修改它提供的属性,否则可能会导致不确定的行为。