UIkit- 7

김정현·2023년 6월 15일
0

UIKit

목록 보기
10/14

PhotoGallery

핵심적인 내용은 레이아웃을 통한 사진 배치와 권한 설정 내용이었다.

이런 배치로 한칸만 포토 컬렉션과, 이미지 셀을 이용하여 배치한 후,

 @IBOutlet weak var PhotoCollectionview: UICollectionView!
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.title = "Photo Gallery App"
        makenavigationItem()
        
        let layout = UICollectionViewFlowLayout()
        
        layout.itemSize = CGSize(width: UIScreen.main.bounds.width / 2 - 0.5, height: 200)
        layout.minimumLineSpacing = 1
        layout.minimumInteritemSpacing = 1
        PhotoCollectionview.collectionViewLayout = layout
        
        PhotoCollectionview.dataSource = self
        
    }

viewdidload에서 전반적인 레이아웃 설정을 마친다.
그 과정에서 깔끔하게 정리하기 위해 함수를 사용했다.

func makenavigationItem() {
        let photoItem = UIBarButtonItem(image: UIImage(systemName: "photo.on.rectangle"), style: .done, target: self, action: #selector(checkpermission))
        photoItem.tintColor = .black.withAlphaComponent(0.7)
        
        self.navigationItem.rightBarButtonItem = photoItem
        
        let refreshItem = UIBarButtonItem(image: UIImage(systemName: "arrow.clockwise"), style: .done, target: self, action: #selector(refresh))
        self.navigationItem.leftBarButtonItem = refreshItem
    }

위에 버튼 들을 설정한다.

특히 오른쪽 버튼에는 갤러리를 활성화해야하기 때문에 접근 허용이 필요하다. 그렇기 때문에 그것에 관한 설정을 해준다.

@objc func checkpermission(){    //권합접근허용
        if PHPhotoLibrary.authorizationStatus() == .authorized || PHPhotoLibrary.authorizationStatus() == .limited{
            DispatchQueue.main.async {
                self.showGallery()
            }
        }else if PHPhotoLibrary.authorizationStatus() == .denied{
            DispatchQueue.main.async {
                self.showAuthorizationdeinedAlert()
            }
        }else if PHPhotoLibrary.authorizationStatus() == .notDetermined{
            PHPhotoLibrary.requestAuthorization { status in
                self.checkpermission()
            }
        }
    }

이건 우선 접근허용 수준에 따른 if문으로 설정한 모습이고 세부 함수는

func showAuthorizationdeinedAlert() {
            let alert = UIAlertController(title: "포토라이브러리 접근 권한을 활성화 해주세요", message: nil, preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "닫기", style: .cancel,handler: nil))
            alert.addAction(UIAlertAction(title: "설정으로 가기", style: .default, handler: {
                action in
                
                guard let url = URL(string: UIApplication.openSettingsURLString) else{
                    return
                }
                if UIApplication.shared.canOpenURL(url) { //url로 이동하는 기능 can으로 가능한지 확인
                    UIApplication.shared.open(url, options: [:], completionHandler: nil)
                } //내 설정으로 가기
               
        }))
            self.present(alert, animated: true)
    }

이렇게 url을 사용한 설정창으로의 이동, 설정창으로 이동할 것인지 묻는 버튼등을 실행하는 요소가 포함되어있다.

그리고 설정이 허용됐다면 갤러리로 이동하는데

func showGallery() {
        let library = PHPhotoLibrary.shared() //라이브러리 개념
        
        var configuration = PHPickerConfiguration(photoLibrary: library) //환경설정에 관함
        configuration.selectionLimit = 10 //사진선택 갯수 제한
        
        let picker = PHPickerViewController(configuration: configuration)
        picker.delegate = self
        present(picker, animated:  true)
    }

갤러리 사진을 지정하는 갯수 제한이라던가 라이브러리를 펴는 개념을 정하고
익스텐션을 통해

extension ViewController: UICollectionViewDataSource{
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 0
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PhotoCell", for: indexPath)
        
        return cell
    }
    
    
}

extension ViewController: PHPickerViewControllerDelegate{
    func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
        
        self.dismiss(animated: true)
    }
    
    
}

정한 사진들을 몇개까지 나열할 것인지 고른 후에 행동을 정한다.

이 다음강의에서 사진을 추가하고, 행동하는 것을 할 예정이다.

이번 강의에서 가장 중요했던 것은 권한접근이었던것 같다. 권한에 따른 설정과 허용하지 않을경우 안내창을 띄우고 설정하게끔 하는 그 메커니즘은 어디서든 사용할터이니 잘 익혀둬야겠다.

0개의 댓글