前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >View官方文档

View官方文档

作者头像
nimomeng
发布2018-09-13 14:23:50
2.5K0
发布2018-09-13 14:23:50
举报
文章被收录于专栏:nimomeng的自我进阶
  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。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016.06.26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档