一些小细节

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

  • 布局管理subviews
    • 定义自己的resize行为
    • 管理一系列subviews
    • override  subviews的大小的位置
    • 转化自己的坐标系和window的坐标系
  • 绘图和动画
    • 在矩形区绘图
    • 某些view变化时的直通车
  • 事件处理
    • 接收touch事件
    • 参与responder chain

新建和配置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 对象。
手动
默认初始化view的方法是 initWithFrame: 设定它在父view中的大小和位置。
示列:
CGRect  viewRect = CGRectMake(0, 0, 100, 100); 
UIView* myView = [[UIView alloc] initWithFrame:viewRect]; 

 

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

view的属性
属性控制显示和行为
可以用 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:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值