当用户触摸视图时,视图会收到 touchesBegan:withEvent:
消息,该消息用来处理触摸事件。
产生一个随机的 UIColor
对象,示例代码:
// 获取三个0到1之间的数字
float red = (arc4random() % 100) / 100.0;
float green = (arc4random() % 100) / 100.0;
float blue = (arc4random() % 100) / 100.0;
UIColor *randomColor = [UIColor colorWithRed:red
green:green
blue:blue
alpha:1.0];
self.circleColor = randomColor;
- 运行循环和重绘视图
iOS 应用启动时会开始一个运行循环 (run loop) 。运行循环的工作是监听事件,例如触摸。当事件发生时,运行循环会为相应的事件找到合适的处理方法,这些处理方法会调用其他方法,以此类推。只有当这些方法都执行完,控制权才会再次回到运行循环。
此时,运行循环首先会检查是否有等待重绘的视图(即收到过
setNeedsDisplay
消息的视图),然后向所有等待重绘的视图发送drawRect:
消息,最后绘制。
以文本框输入为例,示意图如下:
iOS SDK 中提供的视图对象会自动在显示内容发生改变时向自身发送 setNeedsDisplay
消息,例如 UILabel
。而自定义的 UIView
子类,则需手动向其发送 setNeedsDisplay
消息,示例代码如下:
- (void)setCircleColor:(UIColor *)circleColor {
_circleColor = circleColor;
[self setNeedsDisplay];
}
这样再点击视图就可以看到颜色变化了。如图:
- 类扩展
在 BNRHypnosisView.m
文件的顶部 (@implementation
之前 ) 添加的这三行代码,如下:
@interface BNRHypnosisView ()
@property (strong, nonatomic) UIColor *circleColor;
@end
称为 BNRHypnosisView
的类扩展。
作用:声明只在类的内部使用的属性和方法。可以保持头文件简洁,避免内部实现细节的暴露。
- UIScrollView
UIScrollView
是 UIView
的子类,也可以使用 initWithFrame:
消息初始化,还可以作为子视图添加到其他视图。
添加 UIScrollView
后的视图结构如图所示:
设置分页:
[scrollView setPagingEnabled:YES]; //分页显示
若不设置分页,如果有多个对象时,可能出现如下效果(即屏幕同时显示多个视图的一部分):
分页实现原理:
UIScrollView
对象会根据其bounds
的尺寸将contentSize
分割成多个尺寸相同的区域。拖动结束后,UIScrollView
实例会自动滚到并显示其中一个区域。
代码地址:
https://github.com/Ranch2014/iOSProgramming4ed/tree/master/05-RedrawingAndUIScrollView/Hypnosister
《iOS编程(第4版)》 笔记