#66 照片編輯 App
搭配 UIImagePickerController 及 UIAlertController 實現選取照片功能,由於拍照功能無法在模擬器上測試,所以只實作相簿選照片的部分
選完照片還須呼叫 UIImagePickerControllerDelegate 的 function imagePickerController 才能將選取的照片指定給專屬物件顯示出來
若想拍照或想將照片存入相簿中,一定要在 App Info 頁面中設定請求相關權限的文字,新增了 3 個設定,如下:
⚠️請求取用相機權限的 Privacy — Camera Usage Description
⚠️請求取用相片權限的 Privacy — Photo Library Usage Description
⚠️請求加入相片權限的 Privacy — Photo Library Additions Usage Description
結合 UISegmentedControl 取值並計算出長寬比例後,再利用 bounds.size 來調整圖片比例
@IBAction func selectRatio(_ sender: UISegmentedControl) { let length: Int = 350 var width: Int var height: Int switch sender.selectedSegmentIndex { case 0: //1:1 width = length height = length case 1: //16:9 width = length height = Int(Double(length) / 16 * 9) case 2: //10:8 width = length height = Int(Double(length) / 10 * 8) case 3: //7:5 width = length height = Int(Double(length) / 7 * 5) case 4: //4:3 width = length height = Int(Double(length) / 4 * 3) default: width = length height = length } backgroundView.bounds.size = CGSize(width:width, height:height)}
使用 CGAffineTransform 實作照片旋轉、鏡像翻轉及放大縮小,而設定 rotationAngle 則使圖片每次以90度順時鐘方向進行旋轉
照片旋轉
@IBAction func SpinPhoto(_ sender: Any) {
angle += 90
angle = angle % 360 == 0 ? 0 : angle
photoImageView.transform = CGAffineTransform(rotationAngle:
CGFloat(aDegree * Float(angle)))
}
鏡像翻轉
@IBAction func flipPhoto(_ sender: Any) {
scaleX *= -1
photoImageView.transform = CGAffineTransform(scaleX:
CGFloat(scaleX), y: 1)
}
放大縮小
@IBAction func scalePhoto(_ sender: UISlider) {
sender.setValue(sender.value.rounded(), animated: false)
photoImageView.transform = CGAffineTransform(scaleX:
CGFloat(sender.value), y: CGFloat(sender.value))
}
使用 UIGraphicsImageRenderer 及 drawHierarchy 把修改後的照片內容繪製成圖片,再利用 UIActivityViewController 實現圖片分享並儲存到手機相簿裡
儲存照片時會跳出請求權限視窗,要按OK否則會存不進相簿
Github
參考文章