放肆地用 UIBezierPath 和 CAShapeLayer 畫各類圖形

CAShapeLayer 是 CALayer 的子類,可是比 CALayer 更靈活,能夠畫出各類圖形,固然,你也能夠使用其餘方式來畫,隨你。git

雜談

在 CAShapeLayer 中,也能夠像 CALayer 同樣指定它的 frame 來畫,就像這樣:程序員

而後你就會獲得如圖這樣的黑色矩形github

可是,CAShapeLayer 有一個神奇的屬性 path 用這個屬性配合上 UIBezierPath 這個類就能夠達到超神的效果。web

UIBezierPath 顧名思義,這是用貝塞爾曲線的方式來構建一段弧線,你能夠用任意條弧線來組成你想要的形狀,好比,你想用它來和上面同樣畫一個矩形,那就能夠這樣子來作:編程

要注意的是,這裏就不要用backgroundColor 這個屬性了,而要使用 fillColor  strokeColor ,前者表明設置這個 Layer 的填充色,後者表明設置它的邊框色微信

能夠試一下把上面代碼設置顏色的部分改爲這個樣子,那麼運行程序的時候就會是這種樣子架構

玩一下UIBezierPath

在說回 UIBezierPath ,在 UIBezierPath 的 init 方法中,就有不少方便你畫各類圖形的方法,好比你能夠畫一個帶圓角的圖形socket

還能夠指定起始角和半徑畫圓動畫

在這裏涉及到角度的問題,起始角和結束角,這裏的角度使使用弧度制來表示,這裏我收藏了一張圖片,以方便參考網站

怎麼畫曲線

貝塞爾曲線的畫法是由起點、終點、控制點三個參數來畫的,爲了解釋清楚這個點,我寫了幾行代碼來解釋它

我很隨意的定義了三個點,爲了清楚顯示它們的位置,我放了三個矩形在上面以便觀察,而後調用 path.moveToPoint(startPoint) 讓它移動到起始點,而後調用path.addQuadCurveToPoint(endPoint, controlPoint: controlPoint) 這個方法告訴它結束點和控制點,這樣它就能畫出一條有弧度的線條了,若是把fillColor設置一個顏色,那麼它就會變成一個很醜的形狀了,示例圖以下

控制點決定了它的曲率,曲線的頂點不等於控制點的位置,具體能夠看一下貝塞爾曲線的定義,你還能夠使用兩個控制點來畫,兩個控制點能夠使用方法 path.addCurveToPoint(endPoint, controlPoint1: controlPoint, controlPoint2: controlPoint2)來搞定

這樣它會是這個樣子

再來講說 CAShapeLayer

CAShapeLayer 是個神奇的東西,給它一個path它就能變成你想要的形狀,它還有不少能夠玩的地方。綜合使用能夠組合成不一樣的動畫,好比下面這樣:

demo1.gif
demo2.gif
demo3.gif

這三個動畫就是使用了 strokeEnd strokeStart lineWidth 三個屬性,第一個動畫用了strokeEnd這個屬性的值範圍是0-1,動畫顯示了從0到1之間每個值對這條曲線的影響,strokeStart的方法則是相反的,若是把這兩個值首先都設置成0.5而後慢慢改變成0和1的時候就會變成第二個動畫,配合lineWidth則曲線會慢慢變粗,這裏的不少屬性都是支持動畫的。

示例代碼

應用一下

前一陣子在仿時光網這個APP,其中有一個Layer的形狀很怪異,是這樣的

很明顯它能夠用 CAShapeLayer + UIBezierPath 來作,思路大概是這樣,先移動到左上方的位置,而後向下劃線,而後往右劃線,而後往上劃線,還剩一個蓋子,這個蓋子就用一個控制點控制曲率,很是簡單,代碼以下

就能畫出這樣的形狀來

再來一個複雜點的,微信下拉拍小視頻的那隻眼睛頗有趣,來模仿一下那個效果吧,它是這樣的

首先你得畫出這隻眼睛,這是眼睛包括5個部分組成(這個是用OC寫的)

而後,仍是經過 UIBezierPath 和 CAShapeLayer 這樣的老套路來畫,代碼較多

而後更改一下某些屬性的值,方便稍後的動畫

最後根據 UIScrollView 的 contentOffset 來控制各類屬性,辦法較笨,但管用。

最後

總之使用 UIbezierPath 和 CAShapeLayer 能夠畫出你想要的任何形狀,沒有它作不到,只有你想不到,搞定了它們你就能夠輕鬆定製你想要的任何控件了。

問啊-一鍵呼叫程序員答題神器,牛人一對一服務,開發者編程必備官方網站:www.wenaaa.com

QQ羣290551701 彙集不少互聯網精英,技術總監,架構師,項目經理!開源技術研究,歡迎業內人士,大牛及新手有志於從事IT行業人員進入!

相關文章
相關標籤/搜索