[iOS] UIImagePickerController: ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ง ๋ถ๋ฌ์ค๊ธฐ
์ฌ์ง ์จ๋ฒ์์ ์ฌ์ง ๋ถ๋ฌ์ค๊ธฐ
์ค๋ ์ ๋ฆฌํ ๋ด์ฉ์ iOS์ ์ฌ์ง์ฒฉ์ ์ ๊ทผํด ์ฌ์ง์ ๋ถ๋ฌ์ ์ ํ๋ฆฌ์ผ์ด์
๋ด์ ํ์ํ๋ ์์
์ ํ๋ฆ์
๋๋ค. ์ด๊ฑด ์จ๋ดค์ ๋ ์ ๋ฆฌ ์ํ๋ฉด ๋ฌด์กฐ๊ฑด ๊น๋จน๊ณ ๋ค์ ๊ตฌ๊ธ๋งํ๊ณ ์์ ๊ฒ ๊ฐ์์ ์์ํ ๋ ์ ๋ฆฌํฉ๋๋ค!
๋จผ์ ์๋์ ๊ฐ์ด ๊ธฐ๋ณธ์ ์ธ UI๋ฅผ ์ธํ
ํ๊ณ IBOutlet์ ์ ์ํ๋๋ฐ์, ์ด ํฌ์คํธ์ ๋ชฉํ๋ ํ๋ฉด์ ๋ณด์ด๋ ๋
ธ๋์ ๋ฒํผ์ ๋๋ ์ ๋ UIImageView์ ํด๋น ์ฌ์ง์ ํ์ํ๋ ๊ณผ์ ์ ๊ธฐ๋กํ๋ ๊ฒ์
๋๋ค! ๊ทธ๋ผ ์์ํด๋ณด๊ฒ ์ต๋๋ค ๐
1. IBAction ์ค์
๋จผ์ ๋ฒํผ์ด ๋๋ ธ์ ๋์ ๋์์ ์ ์ํ๊ธฐ ์ํด์ IBAction๋ถํฐ ์ ์ํด์ฃผ๊ฒ ์ต๋๋ค.
๋ง์ฐ์ค ์ฐํด๋ฆญ์ผ๋ก UIButton์ ์ ํํ๊ณ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ก ๋๋๊ทธํ๋ฉด IBAction์ ์์ฑํ ์ ์์ต๋๋ค.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var openPhotosButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func openPhotosButtenPressed(_ sender: Any) {
}
}
2. Delegate ์ฑํํ๊ธฐ
๋ทฐ ์ปจํธ๋กค๋ฌ์์ ์ฌ์ง์ ๋ถ๋ฅด๊ธฐ ์ํด์๋ ์ฌ์ง์ ๊ณ ๋ฅด๋ ํ๋ฉด์ธ UIImagePicker๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค. ์ด๋ฅผ ์ํด์ ๋ทฐ ์ปจํธ๋กค๋ฌ์ ๋ ๊ฐ์ง delegate๋ฅผ ์ฑํ์์ผ์ผํฉ๋๋ค.
UIImagePickerControllerDelegate
UIImagePicker
๐ก A view controller that manages the system interfaces for taking pictures, recording movies, and choosing items from the user's media library.
์ ํ์ ๊ณต์๋ฌธ์์ ๋ฐ๋ฅด๋ฉด, UIImagePicker๋ ์ฌ์ง/์์์ ์ฐ๊ฑฐ๋ ์จ๋ฒ์์ ์ฌ์ง์ ๊ณ ๋ฅผ ์ ์๋๋ก ํ๋ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ผ๊ณ ํฉ๋๋ค.
UIImagePickerDelegate
๐ก A set of methods that your delegate object must implement to interact with the image picker interface.
๊ทธ๋ฆฌ๊ณ UIImagePickerDelegate๋ Image Picker์ ์ํธ์์ฉํ๊ธฐ ์ํด ๋ฐ๋์ ๊ตฌํํด์ผํ๋ ๋ฉ์๋์ ์งํฉ์ด๋ผ๊ณ ํฉ๋๋ค. UIImagePickerDelegate๋ฅผ ์ฑํํ๋ฉด ์ด๋ฏธ์ง๋ฅผ ๊ณ ๋ฅด๋ ๋ค์ํ ์ด๋ฒคํธ์ ๋ํ ๋์์ ์ง์๋ฐ์ ์ ์์ต๋๋ค.
UINavigationControllerDelegate
๐ก Use a navigation controller delegate (a custom object that implements this protocol) to modify behavior when a view controller is pushed or popped from the navigation stack of a UINavigationController object.
UINaviationControllerDelegate๋ ํ๋ฉด์ด ์ ํ๋ ๋์ ๋์์ ์ง์ํฉ๋๋ค. Image Picker์์ ์ฌ์ง์ ์ ํํ๊ฑฐ๋, ์ทจ์ํ์ ๋ ๋ค์ ์๋ ์ฌ์ฉ์ค์ด๋ ๋ทฐ๋ก ๋์์ค๋ ์์
์ ์ฒ๋ฆฌํฉ๋๋ค.
๊ฒฐ๊ตญ ์ฌ์ง ์จ๋ฒ์์ ์ด๋ฏธ๋ฅผ ๊ณ ๋ฅด๊ณ ๋ค์ ์๋ํ๋ฉด์ผ๋ก ๋์์ค๋ ์ด๋ฒคํธ๋ค์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์ UIImagePickerControllerDelegate ์ UINavigationControllerDelegate๋ฅผ ์ฑํํด์ผํฉ๋๋ค.
extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate { }
https://github.com/raywenderlich/swift-style-guide ์ ๋ฐ๋ฅด๋ฉด, ํ๋กํ ์ฝ์ extension์ผ๋ก ๋ฐ๋ก ๋นผ์ ์ฑํํ๋๋ก ํ๋๊ฒ ์ข๋ค๊ณ ํฉ๋๋ค!
3. ๊ถํ ์ค์ ํ๊ธฐ
์ ํ๋ฆฌ์ผ์ด์
์ด ์ฌ์ฉ์์ ์ฌ์ง์ฒฉ์ ์ด์ด์ ์์์๋ ์ฌ์ง์ ๊ฐ์ ธ์จ๋ค๋ ๊ฒ์ ๊ฝค๋ ์ํํ ์ผ์
๋๋ค. ๊ทธ๋์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์
๋ค์ ์ฌ์ฉ์์ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํ์ฉํด๊ธฐ ์ํด์ ์ฑ์ ๊ถํ์ ์ถ๊ฐํด์ฃผ๊ฒ ์ต๋๋ค.
๋จผ์ ํ๋ก์ ํธ์ info.plist๋ฅผ ์ด๊ณ ,
ํ๋์ ์ํธ๋ฆฌ๋ฅผ ์ถ๊ฐํด์ฃผ๊ฒ ์ต๋๋ค. "Privacy - Photo Library Usage Description" ๋ฅผ ์ถ๊ฐํด์ ์ฌ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์ ๊ทผ ๊ถํ์ ํ์ฉํฉ๋๋ค.
3. Image Picket ์ด๊ธฐ
์ด์ ์ฌ์ง์ ๊ฐ์ ธ์ค๊ธฐ ์ํด์ Image Picker๋ฅผ ๋ถ๋ฌ์์ผํฉ๋๋ค. ImagePicker ์ญ์๋ ๋ณ๋์ ๋ทฐ ์ด๊ธฐ ๋๋ฌธ์ ImagePickerController์ ์ธ์คํด์ค๋ฅผ ์์ฑ์ ํ์ฌ ํ๋ฉด ์์ ํ์ํฉ๋๋ค.
extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
@IBAction func openPhotosButtenPressed(_ sender: Any) {
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .photoLibrary present(imagePicker, animated: true)
}
}
์ด์ ์ ์ ์ํ IBAction ์์ UIImagePickerController ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ , ํ์ ์ ์ฌ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ง์ ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋น์ฅ์ ํ์ํ์ง ์์ง๋ง ๋ทฐ ์ปจํธ๋กค๋ฌ์๊ฒ Image Picker์ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ์์ํ๊ธฐ ์ํด delegate์ ๋ทฐ์ปจํธ๋กค๋ฌ๋ฅผ ์ถ๊ฐํด์ค๋๋ค. ๋ง์ง๋ง์ผ๋ก ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ํ๋ฉด์ ํ์ํ๋ฉด, ์๋์ ๊ฐ์ด ์ฌ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด๋ฏธ์ง๋ฅผ ํ์ธํ ์ ์๋ Image Picker๊ฐ ๋ฑ์ฅํฉ๋๋ค.
4. ์ ํ๋ ์ฌ์ง ์ด์ฉํ๊ธฐ
์์์ ์ด๋ฆฐ Image Picker์์ ์ฌ์ง์ ์ ํํด๋ ์๋ฌด ๋ณํ๋ ์์ต๋๋ค. ์์ง ์ ํ๋ ์ฌ์ง์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์์ผ๋๊น์! ์ด๋ฐ ์ฒ๋ฆฌ๋ฅผ ์ํด UIImagePickerControllerDelegate์์ ์ ๊ณตํ๋ imagePickerController ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
func imagePickerController(_ picker: UIImagePickerController,
didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { }
๐ก Tells the delegate that the user picked a still image or movie.
์ด ๋ฉ์๋๋ ๋ธ๋ ๊ฒ์ดํธ์๊ฒ ์ฌ์ฉ์๊ฐ ์ฌ์ง์ ๋ค ๊ณจ๋ผ๋๋ค๋ ๊ฒ์ ์๋ฆฝ๋๋ค. ์ธ์๋ก ์ ๋ฌ๋๋ didFinishPickingMediaWithInfo ์ฌ์ฉ์๊ฐ ์ ํํ ์ฌ์ง์ด ๋ค์ด์์ต๋๋ค. ์ง๊ธ Image Picker๋ ๋ทฐ ์ปจํธ๋กค๋ฌ์๊ฒ ์์๋์ด์๊ธฐ ๋๋ฌธ์ ์ด ๋ฉ์๋๋ฅผ ์ ์ํ๋ฉด ์ฌ์ฉ์๊ฐ ์ฌ์ง์ ๊ณ ๋ฅธ ํ์ ์ด๋ฒคํธ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
didFinishPickingMediaWithInfo์ ๋ด๋ถ์๋ ๋์
๋๋ฆฌ ํํ๋ก ๋ค์ํ ์ ๋ณด๋ค์ด ๋ค์ด๊ฐ์์ต๋๋ค.
[__C.UIImagePickerControllerInfoKey(_rawValue: UIImagePickerControllerImageURL): file:///Users/jeonyeohun/Library/Developer/CoreSimulator/Devices/4980723E-92F5-4C7E-8F32-563E13A596BE/data/Containers/Data/Application/FC2D69DE-4D7E-41D2-B709-0AD4842D8F14/tmp/830C1E7B-FC23-41BB-A34A-293BACF85E8A.jpeg,
__C.UIImagePickerControllerInfoKey(_rawValue: UIImagePickerControllerMediaType): public.image,
__C.UIImagePickerControllerInfoKey(_rawValue: UIImagePickerControllerReferenceURL): assets-library://asset/asset.JPG?id=106E99A1-4F6A-45A2-B320-B0AD4A8E8473&ext=JPG,
__C.UIImagePickerControllerInfoKey(_rawValue: UIImagePickerControllerOriginalImage): <UIImage:0x60000301ce10 anonymous {4288, 2848}>]
์ด ์ค์์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฑด UIImageView์ ๋ฃ์ ์ ์๋ UIImage ํ์
์ด๊ธฐ ๋๋ฌธ์ ๋ง์ง๋ง์ ์๋
UIImagePickerControllerOriginalImage๋ฅผ ๊ฐ์ ธ์ค๋ฉด ๋๊ฒ ๋ค์! ๋ฌธ๋ฒ์ด ์กฐ๊ธ ๋ฐ๋์ด์ ํค ๊ฐ์ "UIImagePickerController.InfoKey.originalImage" ๋ก ์ฌ์ฉํ๋ฉด ๋๋ค๊ณ ํฉ๋๋ค. ์ด์ ์ด ๊ฐ์ ์ด์ฉํด์ ์ด๋ฏธ์ง ๋ทฐ๋ฅผ ์ฑ์์ฃผ๋ ์ผ๋ง ๋จ์๋ค์.
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
self.imageView.image = image
}
dismiss(animated: true, completion: nil)
}
์ด๋ ๊ฒ ์ต์ ๋ ๋ฐ์ธ๋ฉ์ ํด์ ๋ํ์ ํ์ด์ฃผ๊ณ ์ด๋ฏธ์ง ๋ทฐ์ ๋ฐ์ดํฐ๋ก ๋ฃ์ด์ฃผ๋ฉด ๋์ ๋๋ค! ๋ง์ง๋ง์ dismiss๋ ์ด๋ฆฐ Image Picker์ ํ๋ฉด์ ๋ซ๋ ์ฉ๋๋ก ์ฌ์ฉ๋ฉ๋๋ค!
5. ๊ฒฐ๊ณผ ํ์ธํ๊ธฐ
์ ๋ฆฌ
1. ๋ทฐ ์ปจํธ๋กค๋ฌ์ UIImagePickerControllerDelegate, UINavigationControllerDelegate ๋ฅผ ์ฑํํ๋ค.
2. Privacy - Photo Library Usage Description ๊ถํ์ ์ถ๊ฐํ๋ค.
3. ImagePicketController ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค. ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ delegate๋ก ์ค์ ํ๋ค.
4. imagePickerController ๋ฉ์๋์ ์ ํ๋ ์ฌ์ง์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ์ ์ํ๋ค.
'๐ ์์ด-์ค-์์ค > ๐ฑ iOS ๊ฐ๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] Scene Life Cycle: iOS 13 ๋ถํฐ ์์๋ Scene-Based Event (0) | 2021.09.19 |
---|---|
[iOS - WWDC2019] UISceneDelegate: Multiple Window๋ฅผ ์ฌ์ฉํ๋ ์ฑ์ ์ค๊ณ (0) | 2021.09.19 |
[iOS] UITapGestureRecognizer: ํ๋ฉด ํญ ๋์ ์ธ์ํ๊ธฐ (0) | 2021.09.13 |
[iOS] UIStackView: Alignment์ Distribution (0) | 2021.09.03 |
[iOS] Segue: Show vs. Show Detail vs. Present Modality vs. Popover (0) | 2021.08.24 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote