투케이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)
    }
}

 


[참고 사이트]

https://blog.naver.com/kkh0977/222672266233

 

127. (ios/swift) photoLibrary 포토 사진 앨범 접근 및 선택 한 사진 이미지 뷰 (imageView) 에 표시 수행

[개발 환경 설정] 개발 툴 : XCODE 개발 언어 : SWIFT [사전 설정] [소스 코드] [결과 출력]

blog.naver.com


 

반응형
Comments