사진 가져오기 (UIImagePickerController)

이번에는 사진을 카메라로 찍거나 앨범에서 가져와서 image를 표현하는걸 해보자.

아래와 같이 실행된다.


======================================================================
1. ImageView 생성
2. UIImagePickerController 생성
3. ImageView에 선택된 Image 표시하기
======================================================================

1. ImageView 생성
 사진을 표현하기 위한 UIImageView를 생성하고 이 ImageView를 tap 하였을 때 특정 event가 실행되게 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class ViewController: UIViewController {
    
    var sampImage: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // (1) UIImageView 생성
        sampImage = UIImageView()
        sampImage.frame.size = CGSize(width: self.view.frame.width/3 * 2, height: self.view.frame.height / 3 * 2)
        sampImage.center = CGPoint(x: self.view.frame.width / 2, y: self.view.frame.height / 2)
        sampImage.contentMode = .scaleAspectFit
        sampImage.backgroundColor = UIColor.blue
        
        // (2) UIImageView에 tapGesture 추가
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(imageTapped))
        self.sampImage.addGestureRecognizer(tapGesture)
        // (3)
        self.sampImage.isUserInteractionEnabled = true
        
        self.view.addSubview(sampImage)
    }
}
cs

(1) UIImageView생성
 - View size에 비례하게 ImageView size를 설정하고 위치는 View의 정중앙으로 한다.
 - Image 가져올 때 비율 설정을 하기 위해 contentMode 설정을 한다.
(2) UIImageView를 tap 할경우 특정 Event가 실행되도록 UITapGestureRecognizer를 추가한다.
(3) UIImageView를 tap 할 경우 반응을 할 수 있도록 isUserInteractionEnabled를 true로 설정한다.


2. UIImagePickerController 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    
    var sampImage: UIImageView!
    override func viewDidLoad() {
        ....
    }
    
    // (1)UIImagePickerController 생성하는 보조 함수
    func imgPicker(_ source: UIImagePickerControllerSourceType) {
        let picker = UIImagePickerController()
        picker.sourceType = source
        picker.delegate = self
        picker.allowsEditing = true
        self.present(picker, animated: true, completion: nil)
    }
    
    // (2)Imgage Tap하였을 때 실행
    @objc func imageTapped() {
        let alert = UIAlertController(title: "선택하시오", message: nil, preferredStyle: .alert)
        if UIImagePickerController.isSourceTypeAvailable(.camera) {
            alert.addAction(UIAlertAction(title: "camera", style: .default, handler: { (_) in
                self.imgPicker(.camera)
            }))
        }
        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
            alert.addAction(UIAlertAction(title: "photoLibrary", style: .default, handler: { (_) in
                self.imgPicker(.photoLibrary)
            }))
        }
        if UIImagePickerController.isSourceTypeAvailable(.savedPhotosAlbum) {
            alert.addAction(UIAlertAction(title: "savedPhotosAlbum", style: .default, handler: { (_) in
                self.imgPicker(.savedPhotosAlbum)
            }))
        }
        alert.addAction(UIAlertAction(title: "cancel", style: .cancel, handler: nil))
        self.present(alert, animated: true, completion: nil)
    }
}
cs

(1) UIImagePickerController를 생성하기 위한 보조 함수이다.
 - (2)에서 중복으로 사용되는 부분이라 이렇게 함수로 따로 빼놓았다.
 - sourceType을 매개변수로 입력받아서 sourceType에 맞는 PickerController를 나타내 준다.
 - PickerController를 사용하기 위해선 두가지 프로토콜(UIImagePickerControllerDelegate, UINavigationControllerDelegate)을 추가해야 한다.
(2) Image를 tap 하였을 때 UIAlertController가 나오게 하였다.
 - UIImagePickerControllerSourceType의 경우 세가지로 되어 있다. 각 type이 적용 가능한지 check한 후 거기에 맞는 pickerController를 나타내게 하였다.

3. ImageView에 선택된 Image 표시하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    
    var sampImage: UIImageView!
    override func viewDidLoad() {
        ....
    }
    
    // UIImagePickerContrtoller 생성하는 보조 함수
    func imgPicker(_ source: UIImagePickerControllerSourceType) {
        ....
    }
    
    // Imgage Tap하였을 때 실행
    @objc func imageTapped() {
        ....
    }
    
    // (1)Image 선택이 완료되었을 때 실행되는 Delegate 함수
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        if let image = info[UIImagePickerControllerEditedImage] as? UIImage {
            self.sampImage.image = image
        }
        picker.dismiss(animated: true, completion: nil)
    }
}
cs

(1) Image가 선택되면 자동으로 실행되는 delegate 함수이다.
 - info에 UIImagePickerControllerEditedImage 를 선택하여 수정된 image를 가져오게 한다.
 - 화면에 표시될 image를 이렇게 가져온 image로 표시한다.












댓글

이 블로그의 인기 게시물

N-Calculator 개인정보 처리

알림창 커스터마이징 (Customizing AlertController) - I

Sudoku_GGagi 개인정보 처리방침