안녕하세요 후르륵짭짭이 입니다!
이번에는 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
여기서 공부하면 좋을 것 같습니다! (하지만 아직 부족하다는거,,,)
** 카메라와 앨범 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)
}
}
'Xcode > IOS' 카테고리의 다른 글
IOS) UIGesture을 알아보자! (0) | 2020.08.25 |
---|---|
IOS) PageViewController로 화면전환을 만들어보자! (1) | 2020.08.16 |
IOS) 다국어 Localized에 대해서 알아보자 (1) | 2020.08.12 |
IOS) UserDefault로 간단한 내용을 저장하자! (0) | 2020.08.11 |
IOS) TextField를 꾸며보자 (@IBDesignable) (0) | 2020.08.09 |
댓글