Notice
Recent Posts
Recent Comments
Link
투케이2K
65. (TWOK/ALGORITHM) [Ios] 패턴 - 함수 체이닝 (Method Chaining) 방식 사용해 권한 요청 및 앨범 사진 선택, 이미지 뷰에 사진 표시 본문
투케이2K 알고리즘
65. (TWOK/ALGORITHM) [Ios] 패턴 - 함수 체이닝 (Method Chaining) 방식 사용해 권한 요청 및 앨범 사진 선택, 이미지 뷰에 사진 표시
투케이2K 2022. 10. 26. 22:45[환경 설정 및 설명]
언 어 : Ios
설 명 : 패턴 - 함수 체이닝 (Method Chaining) 방식 사용해 권한 요청 및 앨범 사진 선택, 이미지 뷰에 사진 표시
[체이닝 방식 간단 설명]
1. 체이닝 이란 코드 부분을 계속 연결해 가면서 설정 하는 방식입니다
2. 체이닝 방식은 사슬 처럼 연결된 고리 처럼 메소드를 계속해서 연결해 사용 하는 방법 입니다
3. 예시 (로직 연결) : 앨범 접근 권한 요청 >> 앨범 접근 권한 응답 받으면 >> 앨범 열기 메소드 호출 >> 사용자 사진 선택 >> 이미지 뷰에 사진 표시
[소스 코드]
import UIKit
// MARK: [import 추가 실시]
import AVFoundation
import Photos
class A_Image: UIViewController {
// MARK: [클래스 설명]
/*
1. A_Image : 카메라, 앨범 접근 클래스
2. info.plist 권한 등록 필요 :
- Privacy - Camera Usage Description
- Privacy - Photo Library Usage Description
- Privacy - Access to a File Provide Domain Usage Description
- Privacy - Microphone Usage Description
*/
// MARK: - [전역 변수 선언 실시]
@IBOutlet weak var imageView: UIImageView! // 이미지 뷰
let photo = UIImagePickerController() // 앨범 이동을 위한 컨트롤러
// MARK: - [뷰 로드 실시]
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
print("")
print("===============================")
print("[A_Image >> viewDidLoad() :: 뷰 로드 실시]")
print("===============================")
print("")
// [초기 이미지 뷰 배경 색상 지정 실시]
self.imageView.backgroundColor = UIColor.gray
// MARK: [앨범 컨트롤러 딜리게이트 지정 실시]
self.photo.delegate = self
}
// MARK: - [뷰 로드 완료]
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("")
print("===============================")
print("[A_Image >> viewWillAppear() :: 뷰 로드 완료]")
print("===============================")
print("")
}
// MARK: - [뷰 화면 표시]
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("")
print("===============================")
print("[A_Image >> viewDidAppear() :: 뷰 화면 표시]")
print("===============================")
print("")
// -----------------------------------------
// [뷰 컨트롤러 포그라운드, 백그라운드 상태 체크 설정 실시]
NotificationCenter.default.addObserver(self, selector: #selector(checkForeground), name: UIApplication.willEnterForegroundNotification, object: nil) // [포그라운드]
NotificationCenter.default.addObserver(self, selector: #selector(checkBackground), name: UIApplication.didEnterBackgroundNotification, object: nil) // [백그라운드]
// -----------------------------------------
// [포그라운드 처리 실시]
checkForeground()
// -----------------------------------------
}
// MARK: - [뷰 정지 상태]
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print("")
print("===============================")
print("[A_Image >> viewWillDisappear() :: 뷰 정지 상태]")
print("===============================")
print("")
}
// MARK: - [뷰 종료 상태]
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
print("")
print("===============================")
print("[A_Image >> viewDidDisappear() :: 뷰 종료 상태]")
print("===============================")
print("")
// -----------------------------------------
// [뷰 컨트롤러 포그라운드, 백그라운드 상태 체크 해제 실시]
NotificationCenter.default.removeObserver(self, name: UIApplication.willEnterForegroundNotification, object: nil) // [포그라운드]
NotificationCenter.default.removeObserver(self, name: UIApplication.didEnterBackgroundNotification, object: nil) // [백그라운드]
// -----------------------------------------
}
// MARK: - [포그라운드 및 백그라운드 상태 처리 메소드 작성]
@objc func checkForeground() {
print("")
print("===============================")
print("[A_Image >> checkForeground() :: 뷰 컨트롤러 포그라운드]")
print("===============================")
print("")
}
@objc func checkBackground() {
print("")
print("===============================")
print("[A_Image >> checkBackground() :: 뷰 컨트롤러 백그라운드]")
print("===============================")
print("")
}
// MARK: - [버튼 클릭 이벤트 처리 실시]
@IBAction func buttonAction(_ sender: Any) {
print("")
print("===============================")
print("[A_Image >> buttonAction() :: 앨범 열기 버튼 클릭 이벤트 발생]")
print("===============================")
print("")
// [앨범의 사진에 대한 접근 권한 확인 실시]
PHPhotoLibrary.requestAuthorization( { status in
switch status{
case .authorized:
print("")
print("===============================")
print("[A_Image >> buttonAction() :: 앨범의 사진에 대한 접근 권한 확인 실시]")
print("상태 :: 앨범 권한 허용")
print("===============================")
print("")
// [앨범 열기 수행 실시]
self.openPhoto()
break
case .denied:
print("")
print("===============================")
print("[A_Image >> buttonAction() :: 앨범의 사진에 대한 접근 권한 확인 실시]")
print("상태 :: 앨범 권한 거부")
print("===============================")
print("")
break
case .notDetermined:
print("")
print("===============================")
print("[A_Image >> buttonAction() :: 앨범의 사진에 대한 접근 권한 확인 실시]")
print("상태 :: 앨범 권한 선택하지 않음")
print("===============================")
print("")
break
case .restricted:
print("")
print("===============================")
print("[A_Image >> buttonAction() :: 앨범의 사진에 대한 접근 권한 확인 실시]")
print("상태 :: 앨범 접근 불가능, 권한 변경이 불가능")
print("===============================")
print("")
break
default:
break
}
})
}
// MARK: - [앨범 열기 수행 실시]
func openPhoto(){
DispatchQueue.main.async {
print("")
print("===============================")
print("[A_Image >> openPhoto() :: 앨범 열기 수행 실시]")
print("===============================")
print("")
// -----------------------------------------
// [사진 찍기 카메라 호출]
self.photo.sourceType = .photoLibrary // 앨범 지정 실시
self.photo.allowsEditing = false // 편집을 허용하지 않음
self.present(self.photo, animated: false, completion: nil)
// -----------------------------------------
}
}
} // [클래스 종료]
// MARK: [앨범 선택한 이미지 정보를 확인 하기 위한 딜리게이트 선언]
extension A_Image: UIImagePickerControllerDelegate, UINavigationControllerDelegate{
// MARK: [사진, 비디오 선택을 했을 때 호출되는 메소드]
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let img = info[UIImagePickerController.InfoKey.originalImage]{
// [앨범에서 선택한 사진 정보 확인]
print("")
print("===============================")
print("[A_Image >> imagePickerController() :: 앨범에서 선택한 사진 정보 확인 및 사진 표시 실시]")
print("[사진 정보 :: ", info)
print("===============================")
print("")
// [이미지 뷰에 앨범에서 선택한 사진 표시 실시]
self.imageView.image = img as? UIImage
}
// [이미지 파커 닫기 수행]
dismiss(animated: true, completion: nil)
}
// MARK: [사진, 비디오 선택을 취소했을 때 호출되는 메소드]
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
print("")
print("===============================")
print("[A_Image >> imagePickerControllerDidCancel() :: 사진, 비디오 선택 취소 수행 실시]")
print("===============================")
print("")
// [이미지 파커 닫기 수행]
self.dismiss(animated: true, completion: nil)
}
}
[참고 사이트]
반응형
'투케이2K 알고리즘' 카테고리의 다른 글
Comments