將 view 變成任意形狀的三種方法

iOS 的 App 畫面因為有著各式各樣的元件而變得美麗,然而不管是 view,label,image view 還是 button,它們預設都是長方形的形狀。

有沒有方法讓它們變成其它形狀呢 ? 當然可以呀,只要你能在白紙上畫出的形狀,就可以用 Swift 畫出,甚至是鬼畫符也可以。

將 view 變成任意形狀的方法不只一種,各有它們適合的情境。接下來我們將介紹三種不同的方法。這三種方法的第一步都是一樣的,都是利用 UIBezierPath 當畫筆,用它將形狀的路徑描繪出來。主要的差別則在之後的步驟。

方法 1 : addSublayer

方法2 : 利用 mask

利用 CAShapeLayer 將 UIBezierPath 畫的路徑變成形狀的 layer,然後再搭配 mask,讓 view 只顯示 UIBezierPath 畫的區塊。此方法較適合我們想切割長方形的 view,讓它只顯示特定區域的時候。

詳細的步驟可參考以下連結。

方法3: 自訂 UI 元件類別,定義它的 function draw

透過自訂 UI 元件類別,覆寫 UIView 的 function draw 改變 View 呈現的樣子。到時候 App 顯示此類別的物件時,都會變成 draw 裡客製的模樣。

class DemoView: UIView {
override func draw(_ rect: CGRect) {
let path = UIBezierPath()
var point = CGPoint(x: 10, y: 10)
path.move(to: point)
point = CGPoint(x: 90, y: 10)
path.addLine(to: point)
point = CGPoint(x: 90, y: 90)
path.addLine(to: point)
path.close()
path.fill()
}
}
let squareView = DemoView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
squareView.backgroundColor = UIColor.red

在 function draw 裡我們利用 UIBezierPath 繪製形狀,然後呼叫 function fill 填滿顏色。

結果:

值得注意的,產生的 DemoView 必須有大小才會觸發 function draw 來繪製,畢竟大小為 0 的元件根本看不到,觸發 draw 繪製也是浪費時間呀。

填滿的顏色

在呼叫 fill 前用 UIColor 的 setFill() 設定填滿的顏色,比方利用 UIColor(red: 0, green: 0, blue: 1, alpha: 1).setFill() 設為藍色。

override func draw(_ rect: CGRect) {
let path = UIBezierPath()
var point = CGPoint(x: 10, y: 10)
path.move(to: point)
point = CGPoint(x: 90, y: 10)
path.addLine(to: point)
point = CGPoint(x: 90, y: 90)
path.addLine(to: point)
path.close()
UIColor(red: 0, green: 0, blue: 1, alpha: 1).setFill()
path.fill()
}

結果

邊框

利用 UIColor(red: 0, green: 0, blue: 1, alpha: 1).setStroke() 將線條設為藍色,然後再用 path.stroke() 畫線。

override func draw(_ rect: CGRect) {
let path = UIBezierPath()
var point = CGPoint(x: 10, y: 10)
path.move(to: point)
point = CGPoint(x: 90, y: 10)
path.addLine(to: point)
point = CGPoint(x: 90, y: 90)
path.addLine(to: point)
path.close()
UIColor(red: 0, green: 0, blue: 1, alpha: 1).setStroke()
path.stroke()
}

透過 lineWidth 調整線的粗細。

path.lineWidth = 10
UIColor.blue.setStroke()
path.stroke()

其它參考連結

--

--

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

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