視圖:重繪與 UIScrollView

當(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: 消息,最后繪制。

以文本框輸入為例,示意圖如下:


視圖在運(yùn)行循環(huán)中重繪自己

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

UIScrollViewUIView 的子類,也可以使用 initWithFrame: 消息初始化,還可以作為子視圖添加到其他視圖。

添加 UIScrollView 后的視圖結(jié)構(gòu)如圖所示:

加入 UIScrollView 后的視圖層次結(jié)構(gòu)

設(shè)置分頁(yè):

[scrollView setPagingEnabled:YES]; //分頁(yè)顯示

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


未設(shè)置分頁(yè)效果

分頁(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版)》 筆記

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容