View官方文档

  1.   Window是UIWindow class下的实例并且处理了总体的application的UI的展现。大部分来说,app的window不会有变化。
    
  2.   View是在CALayers之间的连接处工作,去渲染和变换view的内容。所有UIKit的view背后都有一个layer对象(通常是CALayer 的class),这些layer对象是存储views和处理view相关的动画。
    
  3.   CALayer对象的作用对性能有很大的提升。实际view对象的drawing代码调用越少越好,并且当代码被调用,结果会被Core Animation缓存并且会被尽可能多的复用。复用尤其在animation的时候非常有用。 因此越多复用越少系统消耗。
    
  4.   UIView类使用了按需drawing模型来展示内容。
    
  5.   当你的view的内容变化时,不应当直接redraw这些内容。相反,应当通过setNeedsDisplay或者setNeedsDisplayInRect:method方法来使这些view失效。这些方法告诉系统view有变化并且需要在下一个节点上来重绘。系统会等到当前runloop的结束在重新进行任何重绘之前,这个delay会给机会去删除view或者隐藏view,或者其他形式的对view的操作。所有操作都会在同一时间得到反应。
    
  6.   修改view的集合特性(比如修改位置)并不会自动的使得view的内容重绘。
    
  7.   当渲染view的内容时,实际drawing过程会因view和它对应配置而有所不同。系统的view通常会继承private的drawing方法来渲染content。这些系统views会暴露出接口来供你修改view的实际显现。 如果要自定义UIView的subclass,经常要重写drawRect方法并绘制自己的内容。通常提供view的内容的方法有很多,比如直接设置view的下层layer,或者重载drawRect方法是最通常的技术。
    
  8.   当View开始被显示时,结果被capture在下层的bitmap中。之后,view几何属性的变化并不会经常导致bitmap被重新创建。取而代之的是,contentMode的值会决定bitmap是否应当去裁剪以适应新的bounds或者定位在某个view的边缘之上。
    
  9.   ContentMode是循环利用view的contents的好方法,但是你依然能设置conent Mode为UIViewContentModeRedraw,尤其当你想在scaling或者resizing操作时去自定义views或者去redraw时。此值下,系统会强制调用drawRect:方法来响应几何变换。
    
  10. 如果一个view的集合特性改变了,UIKit会update它的subviews通过如下规则:
    a) 如果配置了autoresizing rules,UIKit仅仅adjust每一个view通过这些rules。
    b) 如果实现了layoutSubviews方法,UIKit会调用它。可以通过这个方法来调整任何subviews的位置和size。
  11. 如果任何view被标记为需要被redrawn,UIKit会让view去自己redraw。对于定义了drawRect方法的自定义view,UIKit会调用那个方法。
  12. frame,boundsproperties的关系
    a) frame是指在其父 中的坐标系统中的frame矩形属性;
    b) bounds是指在view自己的坐标系统中的bounds矩形属性
  13. 使用center或者frame属性主要为了管理当前view的几何属性,比如修改位置或者尺寸。
  14. 针对只修改位置的情况,center属性是最佳方案
  15. 在drawing过程中主要使用bounds属性
  16. 虽然可以单独修改frame、bounds、center属性,但是其中这些属性会互相影响:
    a) Set frame属性时,bounds的size会match到新的frame的size上;center属性也会match到新frame的center上;
    b) Set center属性时,frame的original值也会相应改变
    c) Set bounds的size属性时,frame的size属性也会match到bounds的size属性上。
  17. Points vs Pixels。在iOS中,所有坐标值和距离都是浮点数,引用为points。
  18. 一个points未必对应到屏幕上的一个pixel。
  19. 自定义的部分事件部分如下:
    a) Event-handling,例如touchBegan—touchesMoved—touchesEnded—touchesCancelled
    b) LayoutSubviews
    c) drawRect
  20. drawRect:只有在你的view在运行时变化并且使用了native技术例如UIKit或者Core Graphics等等做绘图时才需要被使用。
  21. 不论哪一种content mode生效,你都可以强制使用setNeedsDisplay或者setNeedsDisplayInRect来重绘内容。
  22. 一个window对象有很多职责:
    a) 包含了app的可视对象
    b) 承载了你的view和其它app对象的touch事件
    c) 和你的app的vc一起工作,促进方向的改变
  23. UIWindowDidBecomeKeyNotification和UIWindowDidResignKeyNotification通知帮助你的app去锁定哪一个window是key window,也就是接收键盘时间和其它touch相关事件的window。
  24. 另一个可以添加subviews到一个view体系里的就是loadView或viewDidLoad方法。
  25. 切记,如果你remove了一个子view并且计划将来要重用,一定要重新retain这个子view。因为removeFromSuperview会autorelease一个subview,在真正移除之前。所以如果你不在下一个事件loop cycle之前retain这个view,view可能会被release掉。
  26. Convert…: fromView:方法会从其它view的坐标系系统转换为local当前view的坐标系系统。如果你指定nil为上述方法的参数,转换会将对应的坐标系落在包含view的window上。
  27. 当实现一个可以拖动的area时,需要经常手动给 子views布局。因为如果给可滚动的内容单独一个大的scrollable内容是不高效的,app需要继承一个root view来包含很多更小的title views。
  28. 每一个view对象都对应了一个CALayer来管理展示层和动画层。
  29. 在自定义view时需要注意:
    a) 决定好合适的初始化函数:
    如果是手动编写,override initWithFrame:方法
    如果是从nib文件读取,override initWithCoder方法。
    b) 实现dealloc方法去处理自定义data的清理问题
    c) 处理自定义绘制,覆盖drawrect方法。
    d) 如果view管理很多子view,那么:
    i.在init序列里创建这些view
    ii.如果view需要自定义布局,则override layoutSubviews方法并将布局方法放在那里。
  30. 很多属性可以允许你是使用覆盖过的方法,例如contentMode设置为contentStrech属性,可以改变最终render的结果,并且可以去由你自己redraw内容。
  31. 改变一个view的subview的animation方法:在iOS4后,使用transitionWithView:duration:options:animations:completion:方法去初始化一个view的变化过渡。在block中传入此方法,则会改变涉及到showing,hiding,adding,removing子view的方法。
  32. 将一个View替换为另一个View的animation:在iOS4以后,可以通过transitionFromView:toView:duration:options:completion:方法来在两个views中切换。这个方法通常会remove第一个view,切换为第二个view,所以如果你还想使用第一个view,最好做好retain。

你可能感兴趣的:(View官方文档)