利用 UIBezierPath 設計特別形狀的圖片 — 比方斜邊 & 愛心

彼得潘看到同學做的玩具總動員 App 十分可愛,App 裡的圖片加了斜邊,粉紅豬變得格外有時尚感。

其實只要撰寫一點點 Swift 程式我們即可創作任意形狀的圖片,接下來就讓我們一步步做出斜邊的彼得潘吧。

1 在畫面上加入 顯示彼得潘的圖片的 image view。

2 新增繼承 UIImageView 的 SharpImageView。

待會我們將把顯示彼得潘圖片的 image view 的類別設為 SharpImageView,然後在 SharpImageView 裡寫程式製造斜邊效果。

點選 File > New > File from Template。

選擇 iOS 下的 Cocoa Touch Class。

記得 Subclass of (父類別) 要設為 UIImageView。

3 回到 storyboard,將 image view 的 Class(類別)設為 SharpImageView。

4 在 SharpImageView.swift 裡加入製造斜邊的程式碼。

定義 function layoutSubviews。

override func layoutSubviews() {
super.layoutSubviews()
let path = UIBezierPath()
path.move(to: CGPoint.zero)
path.addLine(to: CGPoint(x: bounds.width, y: 0))
path.addLine(to: CGPoint(x: bounds.width, y: bounds.height))
path.addLine(to: CGPoint(x: 0, y: bounds.height * 0.8))
path.close()
let shapeLayer = CAShapeLayer()
shapeLayer.path = path.cgPath
layer.mask = shapeLayer
}

我們利用 UIBezierPath 和 CAShapeLayer 做出斜邊的形狀,相關說明可參考以下連結。

我們必須知道 image view 的大小才能準確畫出斜邊的形狀,所以我們將程式寫在 layoutSubviews 裡。為什麼要寫在 layoutSubviews 裡呢 ? 這和 Auto Layout 有關。還不會 Auto Layout 的朋友可等學會 Auto Layout 後再來閱讀以下的說明。

layoutSubviews() 是 UIView 的 function,當它執行時,它會依據 auto layout 的 constraint 排版 subviews。當我們在 function layoutSubviews 的 super.layoutSubviews() 後寫程式時,此時元件自己和它的 subviews 都已依 auto layout 的 constraint 得到位置大小,因此我們可從 bounds.height & bounds.width 取得圖片的寬高。

最後的 layer.mask = shapeLayer 則會實現遮罩的效果,將 SharpImageView 裁切成 shapeLayer 的形狀。

App 執行

有了 SharpImageView,之後畫面上任何的圖片都可以加上斜邊效果,只要將 image view 的 class 設為 SharpImageView 即可。

滿滿的 Swift 大平台

作品集

--

--

彼得潘的 iOS App Neverland
彼得潘的 Swift iOS App 開發問題解答集

彼得潘的iOS App程式設計入門,文組生的iOS App程式設計入門講師,彼得潘的 Swift 程式設計入門,App程式設計入門作者,http://apppeterpan.strikingly.com