View and Window Architecture
1 每个View的背后都有一个Layer负责渲染。Layer的渲染一般由Core Animation完成,并最终由更底层的硬件缓冲区保存屏幕上的每个点。
2 从视觉上看,子视图会遮住父视图的一部分或者全部。就是说,子视图的zorder一定比父视图大。
3 父视图的某些改变会影响到子视图,比如 resize,hide,alpha,trasform 的值。
4 视图树上面的子视图的布局会影响到事件的分发。
5 视图有个contentMode 属性,决定视图本身发生几何变化时,是要在当前的视图的基础上修改还是全部重新绘画。
如果你想让你自定义的视图在放大缩小和改变大小的时候重新绘画自己,可以将视图的contentMode设为UIViewContentModeRedraw。
6 通过 contentStretch 属性你可以指定视图的可伸展区域,当视图被拉伸时,只有这个区域会被拉伸。
7 如果视图的 transform 属性不是 identity transform,则视图的 frame 属性将被视为无效的。
此时,必须无视这个属性,而使用bound和center属性来获取当前视图的位置和大小。
子视图的frame属性还是有效的,因为其frame属性的值是相对于父视图的bounds属性。
8 当bound属性大小发生改变时,frame属性的大小也会跟着改变。
Coordinate System Transformations
1 仿射变换(affine transform)是一个数学模型,通过它可以操纵一个坐标系统上的某个点到另一个不同的坐标系统的映射。
2 用仿射变换改变整个视图,可以通过改变transform属性。
3 用仿射变换改变视图的某一块区域,可以通过在drawrect:方法中改变当前的视图上下文的仿射变换。
高效地使用视图
1 并不是每个视图都要与之对应的视图控制器。
2 尽量少使用自定义的绘画
3 利用contentMode属性带来的好处
4 尽量将视图声明为不透明(通过opaque属性)
5 当视图在滚动时,适当地调整视图的自绘,比如快速滚动时降低视图的绘图质量。
6 不要通过嵌入子视图来定制现有控件
Windows
1 创建主窗口时,大小设为跟屏幕一样大小,无需为状态栏等控件出让位置。状态栏将会在窗口上面。
2 当应用程序切换到后台时,不会收到 UIWindowDidBecomeVisibleNotification 和 UIWindowDidBecomeHiddenNotification 通知,虽然此时程序在后台执行,但是还是被认为是可见的。
3 触摸事件将会被分发到被触摸的窗口,没有跟坐标相关的事件会被分发到关键窗口(key window)
SKIP : Displaying Content on an External Display
Views
1 如果视图控制器的view属性没有被访问过,与之关联的视图树也不会被加载。
2 removeFromSuperview方法在将视图从父视图删除之前会调用autorelease。
3 一个作为第一响应者的视图被隐藏时,不会自动放弃第一响应者状态。
4 对一个视图进行放大缩小时,影响了视图的宽高,但中心点不变。
5 如果一个视图的transform属性不包含identity transform,则其frame和自动调整大小的行为是未定义的。
6 如果视图的layer是CAEAGLLayer对象,则视图使用OpenGL ES自绘。
7 一个非常大的视图一次只显示一小部分的时候,可以使用CATiledLayer来保存整个视图。
8 在drawRect:方法中获取的当前图像上下文(current graphics context )只在该方法被调用的那一次的方法内部有效。
9 调用UIApplication的beginIgnoringInteractionEvents和endIgnoringInteractionEvents方法可以让所有的视图接收不到事件
10 一般情况下,UIView的动画方法在显示动画过程中会屏蔽触摸事件。
11 如果视图持有一些当视图本身被释放的时候就要释放的资源,就要实现dealloc方法。这些资源包括视图申请的内存,其他对象的引用,资源文件等等。
Animations
1 视图的layer属性指定的layer对象是跟视图本身连在一起的,这个layer对象的改变会影响视图本身。
2 其他没有跟视图绑定的layer对象只能通过使用 Core Animation 来实现动画。
the animation's repeat count should be x.5 times, so the final state will be the end state
3 在视图之间创建带动画的切换
transitionWithView:duration:options:animations:completion: 和 presentViewController:animated:completion: 不同,
前者影响到视图层次,后者只是切换控制器。
4 添加删除隐藏显示视图的动画:
transitionFromView:toView:duration:options:completion: