[ios note] view


http://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/CreatingViews/CreatingViews.html#//apple_ref/doc/uid/TP40009503-CH5-SW6

view是程序与用户交流的主要方式。

新建和配置view

用IB或手动创建view,然后加到view hierachies中用。
最简单的做法是在IB中用图型化的方法来处理。
在IB中,你可添加view,分配到hierachies中,配置它们,把view的行为跟代码关联起来。
一般来说,在IB中看到的跟运行时看到的一样。
做完后保存为nib file,这个文件保存对象的状态和配置。
用nib file来保存某个view controller对应的所有view
nib file中最顶级的view用来描述viewcontroller.view
顶级的view应该跟设备屏幕一样大。很少有用nib file来保存部分view的。
nib file跟view controller一起用的时候,需要用nib file的信息来实始化view controller.
系统会在合适的时候载入或去掉你的view。
如果你的nib file并没有跟一个view controller关联,也可以在代码中载入它,通过 NSBundle or UINib 对象。
手动
使用标准的allocation/initialization pattern.
默认初始化view的方法是initWithFrame: 设定它在父view中的大小和位置。
示列:
CGRect  viewRect = CGRectMake(0, 0, 100, 100);
UIView* myView = [[UIView alloc] initWithFrame:viewRect];

 

然后把它加入父view中,见“Adding and Removing Subviews.”

view的属性
属性控制显示和行为
UIView Class Reference.
可以用 view的tag属性做标记,方便在代码中实时地访问view
tag值默认为0
使用UIView的 viewWithTag:方法来检索。
它使用深度优先的算法检索当前view和它的子view(view层级是树状的)

新建和配置view层级
管理view层级是关键动作
包括显示和行为
上图为典型的结构。
还是一样,可以用IB或手动来做层级管理。
添加和删除subview
IB是最方使的方法,所见即所得。拖动扣作。
手动
  • 添加subview  addSubview:
  • 插入subview insertSubView开头三方法  可指定位置
  • 重排subview
  • 移除subview

把subview插入到view时,大小超出view的部分不自动截断。

如果要截断,手动设clipsToBounds

(一堆属性的用法)

转化坐标
很多时候(特别是touch事件处理),程序需要在不同的view frame rect之类的东西之类转换坐标。例如:touch事件向系统报告时使用window坐标系,view处理事件的时候往往要转换成view的本地坐标系统。
UIView中定义了以下方法做转化:
在运行时调整view的大小和位置
一个view的大小变化时,它的subview应该跟着变。
UIView同时支持自动变和手动变。
自动变的情况,需要设定规则。
手动变时,设定具体的大小和位置。
当发生以下事件时,Layout会改变
view的bounds rectangle变化了。
手持设备方向变了
The set of Core Animation sublayers associated with the view’s layer changes and requires layout.
程序调用了view的 setNeedsLayout or layoutIfNeeded
程序调用了view’s underlying layer object的setNeedsLayout
自动处理
autoresizesSubviews subview是否重排
autoresizingMask 控制subview如何重排,这个属性可以组合使用
参考 Table 3-2
手动
当一个view的大小改变时,view的layoutSubview被调用
于是你可以实现layoutSubview方法以实现手工修改布局
通过这一方法可以做到:
直接修改subviews的大小和布局。
增加或移除subviews或Core Animation layers.
使subvewi重绘。
常见的重排subviews的程序是那种有一个非常大的滚动区的程序
当一个程序有非常大的滚动区(N屏)的时候,直接载入一个这么大的view是不合适的,程序一般载入部分可见的view,当滚动动作发生时,即时重排。
写手动重排代码的时候要注意 :
1  设备方向改变
2 有电话呼入的时候,状态栏高度会变化。
两个参考
手动   see the ScrollViewSuite sample.
运行时改动view
程序需要用户输入时,要调整界面响应这个输入(典型的如把当前输入框贴到软键盘上面)
典型的行为如下:
与core animation layers交互
自定义view
自定义一个view的checklist
  • 初始化
  • dealloc 清理
  • drawRect:  绘
  • autoresizingMask  自动重排行为
  • 如果包含subview
    • 初始化时创建 subview
    • 设置subview的  autoresizingMask
    • 如果subview需要自定义layout 重写 layoutSubviews
  • 处理touch-based event
  • 如果要求view的打印版和屏幕上显示的不同,重写 drawRect:forViewPrintFormatter:

相关文章:

右舷

↑ Grab this Headline Animator

Did you enjoy this post? Why not leave a comment below and continue the conversation, or subscribe to my feed and get articles like this delivered automatically to your feed reader.

Comments

No comments yet.

Leave a comment

(required)

(required)