1. 程式人生 > >Swift呼叫相機和系統相簿

Swift呼叫相機和系統相簿

首先需要在Info.plist檔案中新增兩個鍵值對

這裡寫圖片描述
然後利用系統類UIImagePickerController呼叫相機相簿,下面已經封裝好了類,繼承該類呼叫showImagePickerController()方法就會自動呼叫相機相簿
github地址https://github.com/ColdChains/LAXImagePickerController

import UIKit

class LAXImagePickerController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    var
imagePickerController = UIImagePickerController() var didFinishPickingBlock: ((_ image: UIImage?) -> Void)? var imageSize = CGSize.init(width: 100, height: 100) var imageName = "image.png" override func viewDidLoad() { super.viewDidLoad() imagePickerController.modalTransitionStyle = .flipHorizontal imagePickerController.allowsEditing = true
} func showCamera() {//UIImagePickerController.isCameraDeviceAvailable(UIImagePickerControllerCameraDevice.Front) if UIImagePickerController.isSourceTypeAvailable(.camera) { imagePickerController.sourceType = .camera self.show(imagePickerController, sender: nil) } else
{ let alert = UIAlertController.init(title: "提示", message: "沒有檢測到攝像頭", preferredStyle: .alert) let cancel = UIAlertAction.init(title: "確定", style: .cancel, handler: nil) alert.addAction(cancel) self.show(alert, sender: nil) } } private func showPhotoLibrary() { if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) { imagePickerController.sourceType = .photoLibrary imagePickerController.delegate = self self.show(imagePickerController, sender: nil) } else { let alert = UIAlertController.init(title: "提示", message: "不能開啟相簿", preferredStyle: .alert) let cancel = UIAlertAction.init(title: "確定", style: .cancel, handler: nil) alert.addAction(cancel) self.show(alert, sender: nil) } } func showImagePickerController() { let sheet = UIAlertController.init(title: "請選擇", message: nil, preferredStyle: .actionSheet) let cancel = UIAlertAction.init(title: "取消", style: .cancel, handler: nil) let camera = UIAlertAction.init(title: "拍照", style: .default) {(alert) in self.showCamera() } let photo = UIAlertAction.init(title: "相簿", style: .default) {(alert) in self.showPhotoLibrary() } sheet.addAction(camera) sheet.addAction(photo) sheet.addAction(cancel) self.show(sheet, sender: nil) } //儲存圖片至沙盒 private func saveImage(currentImage: UIImage, persent: CGFloat, imageName: String){ if let imageData = UIImageJPEGRepresentation(currentImage, persent) as NSData? { let fullPath = NSHomeDirectory().appending("/Documents/").appending(imageName) imageData.write(toFile: fullPath, atomically: true) print("fullPath=\(fullPath)") } } private func saveImage(currentImage: UIImage, newSize: CGSize, imageName: String){ //壓縮圖片尺寸 UIGraphicsBeginImageContext(newSize) currentImage.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)) if let newImage = UIGraphicsGetImageFromCurrentImageContext() { //UIImageJPEGRepresentation此方法可將圖片壓縮,但是圖片質量基本不變,第二個引數即圖片質量引數。 if let imageData = UIImageJPEGRepresentation(newImage, 1) as NSData? { let fullPath = NSHomeDirectory().appending("/Documents/").appending(imageName) imageData.write(toFile: fullPath, atomically: true) print("fullPath=\(fullPath)") } } } //MARK:- UIImagePickerControllerDelegate func imagePickerController(_ picker:UIImagePickerController, didFinishPickingMediaWithInfo info: [String :Any]){ var image: UIImage? if(picker.allowsEditing){ //裁剪後圖片 image = info[UIImagePickerControllerEditedImage] as? UIImage }else{ //原始圖片 image = info[UIImagePickerControllerOriginalImage] as? UIImage } if image != nil { saveImage(currentImage: image!, newSize: imageSize, imageName: imageName) let fullPath = NSHomeDirectory().appending("/Documents/").appending(imageName) let savedImage: UIImage = UIImage(contentsOfFile: fullPath)! didFinishPickingBlock?(savedImage) //在這裡呼叫網路通訊方法,上傳頭像至伺服器... } picker.dismiss(animated: true, completion: nil) } func imagePickerControllerDidCancel(_ picker:UIImagePickerController){ picker.dismiss(animated:true, completion:nil) } }