본문 바로가기
Xcode/IOS

IOS) UIImagePickerController에 대해서 알아보자

by 후르륵짭짭 2020. 8. 13.
728x90
반응형

안녕하세요 후르륵짭짭이 입니다!

이번에는 UIImagePickerController에 대해서 알아보려고 합니다!!!

위의 영상을 보면 편집하는 것과 원본을 보여주는 것 두가지를 했습니다.

원래는 버튼으로 해야하지만,,,, 간단하게 홀짝으로 구분해서 했습니다.

왜 저렇게 했는지도 설명 하다록 하겠습니다.

 

** InfoPlist에 등록하기 **

자 이렇게 등록을 해줍니다!!! ㅎㅎㅎ (필수 입니다)

만약에 저기 안전 문구에 대한 설명을 다국어로 변화를 주고 싶을 때는 

"NSCameraUsageDescription" = "카메라 사용을 허용해주세용~!";
"NSPhotoLibraryAddUsageDescription" = "사진 앨범 가져오게 허용해주세용~";

이렇게 해주면 됩니다!!!. ( 자세한 내용은 hururuek-chapchap.tistory.com/61?category=909178 여기서 확인해주세요)

 

** UIImagePickerController 사용하기 **

UIImagePickerController를 사용하기 위해서는 두가지를 상속 받아야합니다!

UIImagePickerControllerDelegate 그리고 UINavigationControllerDelegate

 

UIImagePickerControllerDelegate = 이미지를 선택하고 카메라를 찍었을 때 다양한 동작을 도와줍니다.

UINavigationControllerDelegate = 앨범 사진을 선택했을 때, 화면 전환을 네비게이션으로 이동합니다.

 

이러한 이유 때문에 두가지를 상속 받습니다!

PhotoViewController : UIImagePickerControllerDelegate , UINavigationControllerDelegate

이렇게 말입니다!!

 

** AlertSheet를 이용해서 선택지 주기 **

func actionSheetAlert(){
        
        let alert = UIAlertController(title: "선택", message: "선택", preferredStyle: .actionSheet)
        
        let cancel = UIAlertAction(title: "취소", style: .cancel, handler: nil)
        let camera = UIAlertAction(title: "카메라", style: .default) { [weak self] (_) in
            self?.presentCamera()
        }
        let album = UIAlertAction(title: "앨범", style: .default) { [weak self] (_) in
            self?.presentAlbum()
        }
        
        alert.addAction(cancel)
        alert.addAction(camera)
        alert.addAction(album)
        
        present(alert, animated: true, completion: nil)
        
    }
    

이 부분은 그냥 넘어 가겠습니다!

여기서 weak 을 사용했는데,,, 잘은 잘 몰라서 

medium.com/@jang.wangsu/ios-swift-rc-arc-와-mrc-란-그리고-strong-weak-unowned-는-간단하게-적어봤습니다-988a293c04ac

 

[iOS Swift] RC, ARC 와 MRC 란? 그리고 Strong, Weak, Unowned 는? 간단하게 적어봤습니다.

요즘에도 MRC 기반으로 개발 하는 곳이 있을 지 궁금하군요.

medium.com

여기서 공부하면 좋을 것 같습니다! (하지만 아직 부족하다는거,,,)

 

** 카메라와 앨범 UIImagePickerController 등록하기 **

   func presentCamera(){
        
        let vc = UIImagePickerController()
        vc.sourceType = .camera
        vc.delegate = self
        vc.allowsEditing = true
        vc.cameraFlashMode = .on
        
        present(vc, animated: true, completion: nil)
    }
    
    func presentAlbum(){
        
        
        let vc = UIImagePickerController()
        vc.sourceType = .photoLibrary
        vc.delegate = self
        vc.allowsEditing = true
        
        present(vc, animated: true, completion: nil)
    }

이렇게 위에 처럼 UIImagePickerController를 생성하줍니다.

그리고 어떤 타입인지 설정해주고 (카메라 / 앨범)

delegate로 기본적인 기능을 사용 할 수 있도록 해줍니다

allowEditing 으로 사용자가 편집 할 수 있도록 해줍니다.

그리고 UIImagePickerController View를 present해서 화면에 보여주도록 합니다!

 

이제 기본적인 셋팅을 마쳤습니다.

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        dismiss(animated: true, completion: nil)
    }

이 코드는 취소 버튼을 눌렀을 때 화면을 사라지도록 해주는 겁니다 ㅎㅎㅎㅎ

    //카메라나 앨범등 PickerController가 사용되고 이미지 촬영을 했을 때 발동 된다.
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
  
            if let image = info[.editedImage] as? UIImage {
                profileImage.image = image
            }
 		dismiss(animated: true, completion: nil)
        
    }

이제 이 코드를 추가 해줍니다.

그러면 카메라나 앨범에서 사용하기 버튼을 눌렀을 때, info에 설정 때 따라서 image가 저장이 됩니다.

그리고 dismiss로 메모리에서 지워줘야합니다! ㅎㅎㅎㅎ

 

하지만!!!

만약에 위에서 vc.allowsEditing = false로 했다면 

사진이 들어가지 않습니다.

그리고 info[.editedImage , .originalImage] 이것도 되지 않습니다. 

아래와 같은 방식으로 하면 vc.allowsEditing = true 로 했을 때 이미지를 수정 했는데,,,

원본 이미지로 image가 저장이 되었습니다...

if let image = info[.originalImage]{...}
else if let image = info[.editedImage]{...}

 

그래서 방법이 없을까,,,, 했는데,,,

방법은 조건문으로 만약 버튼으로 "원본으로 사진 쓰기"를 누른다면 [.originalImage]를 작동시키고

아니면 [.editedImage]를 작동시켜야 할 것 같습니다.

    //cnt = 0
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        print("picker -> \(String(describing: info[UIImagePickerController.InfoKey.imageURL]))")
   
        if cnt % 2 == 0 {

            if let image = info[.editedImage] as? UIImage {
                profileImage.image = image
            }

        }
        else{

            if let image = info[.originalImage] as? UIImage {
                profileImage.image = image
            }

        }
        
        cnt += 1
        
        print(cnt)
        dismiss(animated: true, completion: nil)
    }

저는 이렇게 홀짝 으로 나눠서 했습니다. 이런식으로 조건을 달아서 하면 잘 됩니다.

만약 더 좋은 방법이 있다면 꼭 올리겠습니다!

 

모두 즐코코코코코콬

하세요!!!

** 전체코드 **

더보기
class PhotoViewController: UIViewController {

    @IBOutlet weak var profileImage: UIImageView!
    
    var cnt = 0
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }
    

    @IBAction func alertBtn(_ sender: Any) {
        actionSheetAlert()
        
    }
    
}

// UIImagePickerControllerDelegate = 카메라 롤이나 앨범에서 사진을 가져올 수 있도록 도와 주는 것
extension PhotoViewController : UIImagePickerControllerDelegate , UINavigationControllerDelegate{
    
    func actionSheetAlert(){
        
        let alert = UIAlertController(title: "선택", message: "선택", preferredStyle: .actionSheet)
        
        let cancel = UIAlertAction(title: "취소", style: .cancel, handler: nil)
        let camera = UIAlertAction(title: "카메라", style: .default) { [weak self] (_) in
            self?.presentCamera()
        }
        let album = UIAlertAction(title: "앨범", style: .default) { [weak self] (_) in
            self?.presentAlbum()
        }
        
        alert.addAction(cancel)
        alert.addAction(camera)
        alert.addAction(album)
        
        present(alert, animated: true, completion: nil)
        
    }
    
    func presentCamera(){
        
        let vc = UIImagePickerController()
        vc.sourceType = .camera
        vc.delegate = self
        vc.allowsEditing = true
        vc.cameraFlashMode = .on
        
        present(vc, animated: true, completion: nil)
    }
    
    func presentAlbum(){
        
        
        let vc = UIImagePickerController()
        vc.sourceType = .photoLibrary
        vc.delegate = self
        vc.allowsEditing = true
        
        present(vc, animated: true, completion: nil)
    }
    
    
    //카메라나 앨범등 PickerController가 사용되고 이미지 촬영을 했을 때 발동 된다.
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        print("picker -> \(String(describing: info[UIImagePickerController.InfoKey.imageURL]))")
   
        if cnt % 2 == 0 {

            if let image = info[.editedImage] as? UIImage {
                profileImage.image = image
            }

        }
        else{

            if let image = info[.originalImage] as? UIImage {
                profileImage.image = image
            }

        }
        
        cnt += 1
        
        print(cnt)
        dismiss(animated: true, completion: nil)
    }
    
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        dismiss(animated: true, completion: nil)
    }
}
728x90
반응형

댓글