天天看點

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記14 視圖繪制Demo

這一話的任務是在視圖中繪制一個小人臉,你可以控制他的嘴角弧度以表示開心後者傷心。

建立一個工程,然後拖一個空的view進去,對齊藍線然後适應尺寸,這都是我們之前講過的内容了。

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記14 視圖繪制Demo

然後建立一個FaceView的UIView類。然後把拖拽的視圖與FaceView關聯,這裡有個小技巧,因為我們的視圖是鋪滿整個螢幕的,是以你想選中view或者viewcontroller會有困難,那麼按住shift和control再點選右鍵,會顯示層次結構中的所有對象,你可以選擇你需要的部分。

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記14 視圖繪制Demo

下面來展示一下FaceView的代碼:

這裡我們重寫了drawRect方法,我們首先繪制小人的臉廓,使用了一個圓形,使用我們上一話中講過的UIBezierPath畫圓的構造器,參數分别為:圓點、半徑、起始弧度、終止弧度、是否是順時針。我們把設定兩個計算屬性給圓點和半徑傳值。如果隻有get方法的話可以不寫get直接寫return語句。faceCenter表示圓點,我們不能直接用center,因為那是父視圖的中點,但是我們可以使用方法convertPoint把父視圖的中點轉移動我們的視圖中。半徑我們希望盡可能大,是以選擇視圖寬高較小一方的一半。初始弧度為0,終止弧度2*M_PI表示2π。看起來一個完美的圓盡在我們的掌握之中了。

但是當你寫完上述代碼的時候你會發現報錯了!你可能對錯誤的原因産生疑惑,其實問題出在2*M_PI上,它的類型是Double,而我們都知道繪制需要使用的機關都是CGFloat,這裡的錯誤提示确實有問題以至于你很難發現錯誤。我們需要一個轉型

這裡我繼續設定描邊的寬度,把它作為類的屬性設定初始化值然後在drawRect中調用它。

我們考慮邊的寬度的改變會引起視圖的改變,這就需要我們在寬度改變的時候重繪我們的視圖,是以在屬性lineWidth後面設定一個觀察器,一旦值有變動,就調用setNeedsDisplay,還記得之前講過的我們不能調用drawRect,那是系統方法,但是我們可以通過調用setNeedsDisplay通知系統調用drawRect已達到重繪的目的。我們繼續定義一個顔色,同樣的做法。

最後加上stroke方法。完整代碼:

運作結果:

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記14 視圖繪制Demo

看起來離邊緣太近了,而且如果你旋轉螢幕的話會看到:

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記14 視圖繪制Demo

這顯然不是我們,我們之前講過的每一次旋轉螢幕系統都會重新調用drawRect,而預設的視圖适應規則就是拉伸。現在把這些問題改正。

首先在storyboard中選中faceview把第一欄中的mode改成Redraw。

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記14 視圖繪制Demo

然後在faceView的代碼中把原來的半徑乘上個0.90,再次運作:

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記14 視圖繪制Demo
【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記14 視圖繪制Demo

是不是舒服很多了?最後我們需要繪制眼睛和嘴巴。

下面是所有的代碼,難度不大,我加了注釋,你應該可以看懂:

效果:

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記14 視圖繪制Demo
【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記14 視圖繪制Demo

當你修改smiliness的值為一個負數小數時,效果如圖:

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記14 視圖繪制Demo

繼續閱讀