#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

參考文章

--

--