當(dāng)用戶觸摸視圖時(shí),視圖會(huì)收到 touchesBegan:withEvent: 消息,該消息用來(lái)處理觸摸事件。
產(chǎn)生一個(gè)隨機(jī)的 UIColor 對(duì)象,示例代碼:
// 獲取三個(gè)0到1之間的數(shù)字
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;
- 運(yùn)行循環(huán)和重繪視圖
iOS 應(yīng)用啟動(dòng)時(shí)會(huì)開(kāi)始一個(gè)運(yùn)行循環(huán) (run loop) 。運(yùn)行循環(huán)的工作是監(jiān)聽(tīng)事件,例如觸摸。當(dāng)事件發(fā)生時(shí),運(yùn)行循環(huán)會(huì)為相應(yīng)的事件找到合適的處理方法,這些處理方法會(huì)調(diào)用其他方法,以此類推。只有當(dāng)這些方法都執(zhí)行完,控制權(quán)才會(huì)再次回到運(yùn)行循環(huán)。
此時(shí),運(yùn)行循環(huán)首先會(huì)檢查是否有等待重繪的視圖(即收到過(guò)
setNeedsDisplay消息的視圖),然后向所有等待重繪的視圖發(fā)送drawRect:消息,最后繪制。
以文本框輸入為例,示意圖如下:

iOS SDK 中提供的視圖對(duì)象會(huì)自動(dòng)在顯示內(nèi)容發(fā)生改變時(shí)向自身發(fā)送 setNeedsDisplay 消息,例如 UILabel。而自定義的 UIView 子類,則需手動(dòng)向其發(fā)送 setNeedsDisplay 消息,示例代碼如下:
- (void)setCircleColor:(UIColor *)circleColor {
_circleColor = circleColor;
[self setNeedsDisplay];
}
這樣再點(diǎn)擊視圖就可以看到顏色變化了。如圖:

- 類擴(kuò)展
在 BNRHypnosisView.m 文件的頂部 (@implementation 之前 ) 添加的這三行代碼,如下:
@interface BNRHypnosisView ()
@property (strong, nonatomic) UIColor *circleColor;
@end
稱為 BNRHypnosisView 的類擴(kuò)展。
作用:聲明只在類的內(nèi)部使用的屬性和方法。可以保持頭文件簡(jiǎn)潔,避免內(nèi)部實(shí)現(xiàn)細(xì)節(jié)的暴露。
- UIScrollView
UIScrollView 是 UIView 的子類,也可以使用 initWithFrame: 消息初始化,還可以作為子視圖添加到其他視圖。
添加 UIScrollView 后的視圖結(jié)構(gòu)如圖所示:

設(shè)置分頁(yè):
[scrollView setPagingEnabled:YES]; //分頁(yè)顯示
若不設(shè)置分頁(yè),如果有多個(gè)對(duì)象時(shí),可能出現(xiàn)如下效果(即屏幕同時(shí)顯示多個(gè)視圖的一部分):

分頁(yè)實(shí)現(xiàn)原理:
UIScrollView對(duì)象會(huì)根據(jù)其bounds的尺寸將contentSize分割成多個(gè)尺寸相同的區(qū)域。拖動(dòng)結(jié)束后,UIScrollView實(shí)例會(huì)自動(dòng)滾到并顯示其中一個(gè)區(qū)域。
代碼地址:
https://github.com/Ranch2014/iOSProgramming4ed/tree/master/05-RedrawingAndUIScrollView/Hypnosister
《iOS編程(第4版)》 筆記