利用 UIBezierPath 設計特別形狀的圖片 — 風景介紹

前言

這次要分享的是瓜地馬拉的風景,這也是我曾待過一年的地方,想當初那些年~~~,是非常精彩與快樂的日子,這邊位於中南美洲墨西哥下方,一個國家稱之Guatemala,是台灣友邦國家。

也是目前少之又少的穩定友邦XD

這些時光是我在擔任外交替代役的時候待的地方,想當初自己年輕時跑了好多地方,學著講西班牙文,遇見許多台灣的志工,那種他鄉遇故知的感覺,想起來就令人愉悅。

好了,說得有點太多,就進入此次主題吧!

重點

這次練習的項目是將每個照片做排版,不再是一張四四方方的圖片,我們可以透過「遮罩」的功能,再加上貝茲曲線來做個斜邊。

如果不太熟悉,可以先看這個教學:

操作步驟

先找個幾張漂亮的風景,當然就是靠Google大神,於是找好了圖片就放到Xcode中的Assets.xcassets。

接著在storyboard上面拉滿一定數量的UIImageView,並將圖片設定上去,文字部分則是採用Label的方式加上背景顏色和透明度的方式來呈現。

希望每一個圖片之間都有斜邊來做區隔,所以會發現第一張和最後一張的範圍會不一樣,第二張到第四張都是相同模式,所以以下需要三個動作。

建立UIImageView Class

選擇Cocoa Touch Class
命名Class名稱
將其ImageView指定Class

針對Class撰寫layoutSubviews

上述完成後,接著開始針對Class來寫一些初始時要進行遮罩的程式碼Function。

這部分我們將使用到layoutSubViews,這部分我以為他會自己產生,但似乎不會,不過看到override這樣的字眼想必一定是父類別就有的function,所以才可以這樣做。

在定義這個function時,最好也加上super.layoutSubviews(),因為要override做自己事情時,也把原來會做的事做完再做自己的事情,除非你不想要執行原來function做的事情。

使用UIBezierPath來畫出遮罩面積

//宣告path為貝茲曲線物件

let path = UIBezierPath()

//第一個座標點,使用CGPoint.zero(x=0,y=0)

path.move(to: CGPoint.zero)

//使用bouns取得圖片寬度,畫到圖像右上邊界(x為圖片寬度,y不變)

path.addLine(to: CGPoint(x: bounds.width, y: 0))

//使用bouns取得圖片寬度,畫到圖像右下邊界(x不變,y畫到圖片右下邊界)

path.addLine(to: CGPoint(x: bounds.width, y: bounds.height))

//使用bouns取得圖片寬度,畫到圖像左下邊界(x到圖片左邊,y畫到圖片左下高度*0.8)也就是往上裁切

path.addLine(to: CGPoint(x: 0, y: bounds.height * 0.8))

//回到第一個點(0,0)

path.close()

let shapeLayer = CAShapeLayer()

//取得路徑

shapeLayer.path = path.cgPath

//指定遮罩

layer.mask = shapeLayer

第二張至第四張圖片

這次改變作法,第二張呈現的方式在上面就要往右下畫,這次計算的方式就有點不太同,因為一開始就要算出第一張圖片的斜角(左邊與右邊)差異的高度。

由上圖來看大概就是藍色線條高度-黃色線條高度,可以得到高度差,程式碼大概如下,其實只是順序大致上改變了,喔對了,這部分我是另外新增一個UIImageView Class來做處理。

let path = UIBezierPath()

path.move(to: CGPoint.zero)

//第一條線就往下傾斜

path.addLine(to: CGPoint(x: bounds.width, y: 49))

path.addLine(to: CGPoint(x: bounds.width, y: bounds.height))

//最後一條也要往上傾斜

path.addLine(to: CGPoint(x: 0, y: bounds.height — 49))

path.close()

let shapeLayer = CAShapeLayer()

shapeLayer.path = path.cgPath

layer.mask = shapeLayer

最後一張

最後一張就是只有上面要做斜角,跟第一張相反,所以也是偷懶用一個新的UIImageView Class來做,程式碼如下。

let path = UIBezierPath()

path.move(to: CGPoint.zero)

//第一條就傾斜

path.addLine(to: CGPoint(x: bounds.width, y: 49))

path.addLine(to: CGPoint(x: bounds.width, y: bounds.height))

//最後一條就給他圖片高度

path.addLine(to: CGPoint(x: 0, y: bounds.height))

path.close()

let shapeLayer = CAShapeLayer()

shapeLayer.path = path.cgPath

layer.mask = shapeLayer

成果分享

--

--