视图:重绘与 UIScrollView

当用户触摸视图时,视图会收到 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

UIScrollViewUIView 的子类,也可以使用 initWithFrame: 消息初始化,还可以作为子视图添加到其他视图。

添加 UIScrollView 后的视图结构如图所示:

加入 UIScrollView 后的视图层次结构

设置分页:

[scrollView setPagingEnabled:YES]; //分页显示

若不设置分页,如果有多个对象时,可能出现如下效果(即屏幕同时显示多个视图的一部分):


未设置分页效果

分页实现原理:
UIScrollView 对象会根据其 bounds 的尺寸将 contentSize 分割成多个尺寸相同的区域。拖动结束后,UIScrollView 实例会自动滚到并显示其中一个区域。

代码地址:
https://github.com/Ranch2014/iOSProgramming4ed/tree/master/05-RedrawingAndUIScrollView/Hypnosister

《iOS编程(第4版)》 笔记

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容