IOS開發(fā)系列——UIView專題之三:自定義繪制篇

3UIView重繪機(jī)制

3.1DrawRect機(jī)制

3.1.1簡(jiǎn)介

iOS的繪圖操作是在UIView類的drawRect方法中完成的鼻忠,所以如果我們要想在一個(gè)UIView中繪圖,需要寫一個(gè)擴(kuò)展UIView的類杈绸,并重寫drawRect方法帖蔓,在這里進(jìn)行繪圖操作,程序會(huì)自動(dòng)調(diào)用此方法進(jìn)行繪圖瞳脓。

重繪操作仍然在drawRect方法中完成塑娇,但是蘋果不建議直接調(diào)用drawRect方法,當(dāng)然如果你強(qiáng)直直接調(diào)用此方法劫侧,當(dāng)然是沒(méi)有效果的埋酬。蘋果要求我們調(diào)用UIView類中的setNeedsDisplay方法,則程序會(huì)自動(dòng)調(diào)用drawRect方法進(jìn)行重繪烧栋。(調(diào)用setNeedsDisplay會(huì)自動(dòng)調(diào)用drawRect)

在UIView中,重寫drawRect: (CGRect) aRect方法,可以自己定義想要畫的圖案.且此方法一般情況下只會(huì)畫一次.也就是說(shuō)這個(gè)drawRect方法一般情況下只會(huì)被掉用一次.當(dāng)某些情況下想要手動(dòng)重畫這個(gè)View,只需要掉用[self setNeedsDisplay]方法即可.

drawRect是在Controller->loadView, Controller->viewDidLoad兩方法之后調(diào)用的.所以不用擔(dān)心在控制器中,這些View的drawRect就開始畫了.這樣可以在控制器中設(shè)置一些值給View(如果這些View draw的時(shí)候需要用到某些變量值).

1.如果在UIView初始化時(shí)沒(méi)有設(shè)置rect大小写妥,將直接導(dǎo)致drawRect不被自動(dòng)調(diào)用。

2.該方法在調(diào)用sizeThatFits后被調(diào)用审姓,所以可以先調(diào)用sizeToFit計(jì)算出size珍特。然后系統(tǒng)自動(dòng)調(diào)用drawRect:方法。

3.通過(guò)設(shè)置contentMode屬性值為UIViewContentModeRedraw魔吐。那么將在每次設(shè)置或更改frame的時(shí)候自動(dòng)調(diào)用drawRect:扎筒。

4.直接調(diào)用setNeedsDisplay,或者setNeedsDisplayInRect:觸發(fā)drawRect:酬姆,但是有個(gè)前提條件是rect不能為0.

以上1,2推薦嗜桌;而3,4不提倡

1、若使用UIView繪圖辞色,只能在drawRect:方法中獲取相應(yīng)的contextRef并繪圖骨宠。如果在其他方法中獲取將獲取到一個(gè)invalidate的ref并且不能用于畫圖。drawRect:方法不能手動(dòng)顯示調(diào)用相满,必須通過(guò)調(diào)用setNeedsDisplay或者setNeedsDisplayInRect诱篷,讓系統(tǒng)自動(dòng)調(diào)該方法。

2雳灵、若使用calayer繪圖棕所,只能在drawInContext:中(類似魚drawRect)繪制,或者在delegate中的相應(yīng)方法繪制悯辙。同樣也是調(diào)用setNeedDisplay等間接調(diào)用以上方法琳省。

3迎吵、若要實(shí)時(shí)畫圖,不能使用gestureRecognizer针贬,只能使用touchbegan等方法來(lái)掉用setNeedsDisplay實(shí)時(shí)刷新屏幕击费。

3.2使用技巧

3.2.1UITableViewCell中使用DrawRect

不能在UITableViewCell中直接使用DrawRect方法,應(yīng)該在ContentView中增加一個(gè)子View桦他,然后在這個(gè)字View中使用DrawRect方法蔫巩。

3.2.2DrawRect之后注意用hitTest:withEvent:方法處理事件接收

//用戶觸摸時(shí)第一時(shí)間加載內(nèi)容

- (UIView*)hitTest:(CGPoint)point

withEvent:(UIEvent*)event{

UIView*result = [superhitTest:pointwithEvent:event];

CGPointbuttonPoint = [_subjectButtonconvertPoint:pointfromView:self];

if([_subjectButtonpointInside:buttonPointwithEvent:event]){

return_subjectButton;

}

returnresult;

}

3.3參考鏈接

CGContextRef用法

http://blog.csdn.net/wmqi10/article/details/8730352

iOS重繪機(jī)制drawRect

http://blog.csdn.net/fww330666557/article/details/8647608

iOS CGContextRef畫圖小結(jié)

http://blog.sina.com.cn/s/blog_9693f61a0101deko.html

iOS使用CGContextRef繪制各種圖形

http://www.devstore.cn/essay/essayInfo/116.html

(good)IOS用CGContextRef畫各種圖形(文字、圓快压、直線圆仔、弧線、矩形蔫劣、扇形坪郭、橢圓、三角形脉幢、圓角矩形歪沃、貝塞爾曲線、圖片)

http://blog.csdn.net/rhljiayou/article/details/9919713

CGContextDrawImage畫圖圖形相反鏡像

http://blog.csdn.net/koupoo/article/details/8670024

drawRect:和-

(void)setNeedsDisplay的一些理解

http://www.cnblogs.com/pengyingh/articles/2383688.html

iOS畫圖以及清空

http://blog.csdn.net/woshidaniu/article/details/46683409

drawRect自動(dòng)清除屏幕

http://www.cocoachina.com/bbs/read.php?tid=7085

主題: drawRect中嫌松,如何清除之前所繪制的內(nèi)容

http://www.cocoachina.com/bbs/read.php?tid=28302&page=e&#a

drawRect中沪曙,如何清除之前所繪制的內(nèi)容

http://www.cocoachina.com/bbs/read.php?tid=28302

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市萎羔,隨后出現(xiàn)的幾起案子珊蟀,更是在濱河造成了極大的恐慌,老刑警劉巖外驱,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異腻窒,居然都是意外死亡昵宇,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門儿子,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瓦哎,“玉大人,你說(shuō)我怎么就攤上這事柔逼〗” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵愉适,是天一觀的道長(zhǎng)犯助。 經(jīng)常有香客問(wèn)我,道長(zhǎng)维咸,這世上最難降的妖魔是什么剂买? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任惠爽,我火速辦了婚禮,結(jié)果婚禮上瞬哼,老公的妹妹穿的比我還像新娘婚肆。我一直安慰自己,他們只是感情好坐慰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布较性。 她就那樣靜靜地躺著,像睡著了一般结胀。 火紅的嫁衣襯著肌膚如雪赞咙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天把跨,我揣著相機(jī)與錄音人弓,去河邊找鬼。 笑死着逐,一個(gè)胖子當(dāng)著我的面吹牛崔赌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播耸别,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼健芭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了秀姐?” 一聲冷哼從身側(cè)響起慈迈,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎省有,沒(méi)想到半個(gè)月后痒留,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蠢沿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年伸头,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舷蟀。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡恤磷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出野宜,到底是詐尸還是另有隱情扫步,我是刑警寧澤妄帘,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布菇怀,位于F島的核電站螟蝙,受9級(jí)特大地震影響是掰,放射性物質(zhì)發(fā)生泄漏雷蹂。R本人自食惡果不足惜废酷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一朵你、第九天 我趴在偏房一處隱蔽的房頂上張望崭添。 院中可真熱鬧,春花似錦吭历、人聲如沸堕仔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)摩骨。三九已至,卻和暖如春朗若,著一層夾襖步出監(jiān)牢的瞬間恼五,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工哭懈, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留灾馒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓遣总,卻偏偏與公主長(zhǎng)得像睬罗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子旭斥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容