iOS Programming: The Big Nerd Ranch Guide (4th Edition) 阅读笔记-关于View和View Hierarchy

来源:互联网 发布:lcd字库生成软件 编辑:程序博客网 时间:2024/05/21 09:20

关于 View

  • ViewUIView(或其子类)的一个实例
  • View负责对自己的绘制
  • View处理如触摸等事件
  • View存在于某个 View Hierarchy,且 View Hierarchy的根为applicationwindow
  • View既可以在Interface Builder,也可以在代码中创建

 

关于 ViewHierarchy

  • application启动时,会创建一个UIWindow的实例作为整个 application中所有 view的容器,然后便可以向其中添加其他 View。(在 AppDelegate中对应为 application:didFinishLaunchingWithOptions:方法)
  • view被添加到window中后,它就成为了这个 window subview,同时该 view也可以拥有自己的 subview,于是最终便会形成一个由 view组成、window为根的view hierarchy
  • view hierarchy创建完毕后,它将会分为两步被绘制到屏幕上:
    • 每个 hierarchy中的 view(包括 window)绘制自己并 return给自己的 layer layer CALayer的实例)。
    • 所有的 layer被叠加在一起呈现在屏幕上。

 

关于 Frame,CGRect, CGPoint

  • UIView designated initializer initWithFrame:,该方法有一个参数类型为 CGRect,赋给该 view frame属性,然后生成一个 view的实例。
  • View frame指明 view的尺寸和 view与其 superview的相对位置。
  • CGRect是一个C的结构体,它包含另外两个结构体 CGPoint,分别用为 origin size,每个结构体中有 float类型的 x , y两个成员变量。

 

通过代码产生 viewview hierarchy的一般步骤:

  • 通过 CGRectMake方法传入尺寸和相对于 superview的位置坐标,生成一个 CGRect作为 viewframe
  • 通过 View initWithFrame:方法生成初始化 view实例
  • 对该 view实例进行需要的设置(如背景颜色等)
  • 将该 view通过其 superviewaddSubview方法添加到 hierarchy

同时会自动将该 view superview属性指向该 superviewsuperview属性为 weak以避免循环引用)

 

关于 point pixels

  • 为了兼顾多种分辨率和尺寸,iOS中采用 point描述尺寸和位置,而不是 pixels
  • non-Retina设备(iPhone 2G, 3G, 3GS

Render @1x 1 point对应 1 pixel

  • Retina设备(iPhone 4, 4s, 5, 5s ,6

Render @2x 1 point对应 2 pixel

  • Retina设备(iPhone 6 Plus

Render @3x 1 point对应 3 pixel

实际在渲染时为  @2.46x,但苹果为了方便开发者故使用 @3x素材,再缩放到@2.46x

 

自定义 view的绘制方法drawRect:

  • drawRect:方法是 view将其自身绘制到 layer上的过程,现有的 UIView均已实现了该方法,例如 UIButton中该方法在 view中间绘制亮蓝色文本,而自定义 view则需要自己覆写该方法。
  • 覆写 drawRect:的一般步骤:
    • 获取 view boundsboundsUIView的属性,是描述需要绘制的东西相对于view的尺寸和位置。( frame是描述 view相对于其superview的尺寸和位置)因此若需要一个全屏的 frame可以取 window bounds
    • 使用 UIBezierPath 类绘制图形
      • 创建 UIBezierPath类的实例
      • 为该实例指明绘制的路径(可参见开发者文档)
      • 配置该 path实例的属性(如 lineWidth
      • 对画笔进行设置(如stroke的颜色)
      • 向该实例发送消息(如 stroke)进行绘制
0 0
原创粉丝点击