#9 運用 UIBezierPath 繪製龍貓
構圖可以很好的練習 UIBezierPath、CGAffineTransform的功能,比例縮放、位移、鏡射、旋轉。幾乎每項功能都使用到,最終顯示的結果與調整的順序很重要。
・CGAffineTransform:可應用於 UIView、CALayer、UIBezierPath
-轉換方法:Rotated(旋轉)、scaledBy(比例/鏡射)、translatedBy(旋轉)
-可同時寫在一個 CGAffineTransform() 進行轉換
-使用順序會影響最終轉換結果
・BondingBox 使用方式:
-1. 先取得 cgPath 輪廓大小
-2. 將取得的輪廓賦予 CAShapeLayer 的 bounds
-3. 設定圖形基準點位置
-問題:做完後才發現其 CGAffineTransform 的轉換要點跟技巧,但 Macbook 不斷在抗議太熱了,更一度罷工,只好之後再回來改好來。
先放張努力刻出龍貓的成果圖!🤔
使用 CGAffineTransform 的座標情況:
-若 Layer 直接放入 ViewController 內預設的 View ,使用 CGAffineTransform 的轉換方法,座標系統會套用 View (手機左上方) 的原點位置,在鏡像時圖像會超出 View 範圍。
-若 Layer 存入 UIView 再加入 ViewController 內預設的 View,會以 UIView 元件自己本身為中心點進行旋轉,比例縮放。
-先套用鏡像功能後,調整方向與旋轉會與原座標系相反。
1. 在 Boxy SVG 將圖片的輪廓描出
2. 取出 SVG 後,用 SVG Converter 轉換為 Swift UIBezierPath
3. ViewController 啟用 Preview 即時預覽功能
#Preview {
UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController()!
}
4. 將 SVG Converter 轉換後的路徑貼入 Xcode Project 的 ViewController 內
let shapeLayer = CAShapeLayer()
//建立 CAShapeLayer 物件
shapeLayer.path = path.cgPath
//將路徑轉換為 CAShapeLayer 形狀
let boundingBox = path.cgPath.boundingBox
//取得路徑的矩形範圍的大小
shapeLayer.bounds = boundingBox
//將取得的範圍賦予要設定的 shapeLayer
shapeLayer.position = CGPoint(x: boundingBox.midX, y: boundingBox.midY)
//將基準點設定在圖形的中央位置
transform = CGAffineTransform(scaleX: -1, y: 1).translatedBy(x: -35, y: -93).scaledBy(x: 0.35, y: 0.35).rotated(by: .pi/180 * -12)
//轉換:鏡向圖形 (scaleX: -1, y: 1)
//轉換:位置偏移 .translatedBy(x: -35, y: -93)
//轉換:比例縮放 .scaledBy(x: 0.35, y: 0.35)
//轉換:旋轉圖形 .rotated(by: .pi/180 * -12)
shapeLayer.setAffineTransform(transform)
//將轉換的設定賦予 shapeLayer
shapeLayer.fillColor = CGColor(red: 23/255, green: 23/255, blue: 25/255, alpha: 1)
//填充圖形顏色
view.layer.addSublayer(shapeLayer)
//加入 view 視圖內