티스토리 뷰
지난 글에 이어 이번 글에서는 아이폰에 저장되어있는 사진들로 컬렉션 뷰를 채워보는 작업을 해보도록 하겠습니다. 이렇게 iOS에서 사진이나 비디오들을 다루기 위해선 PhotoKit을 사용해야 합니다. 여기서 간단하게 iOS의 Photos 프레임워크가 사진과 동영상을 취급하는 모습을 그림으로 나타내 보겠습니다.
위의 그림과 같이 iOS의 사진과 비디오는 3 계층으로 되어있는데 간단하게 말하면 Asset과 Asset을 모은 Asset Collection, Asset Collection을 모은 Collection List로 구성됩니다. Asset은 사진이나 비디오 파일을 말하며 Asset Collection은 앨범이나 사진 폴더라고 보면 쉽습니다. 그리고 이러한 폴더들을 모아둔 것이 Collection List라고 볼 수 있습니다. 이러한 계층을 알아야 Photos 프레임워크의 사용법을 이해하기 쉽습니다.
우선 저번에 만든 컬렉션 뷰를 아이폰의 사진으로 채우기 위해 Photos 프레임워크를 import 합니다.
그런 뒤 아이폰의 사진들을 가지고 올 리스트와 가지고 온 사진들을 관리해주는 이미지 매니저를 선언해줍니다.
그럼 이제 선언한 fetchResult라는 리스트를 아이폰에 저장된 사진들로 채워보겠습니다.
변수의 이름을 보면 알 수 있는데, 큰 계층부터 차례대로 찾아들어가는 형태입니다. 이번에 가져온 collection List는 전체 앨범을 가지고 온 것이기 때문에 그 속에는 하나의 asset Collection만 존재합니다. 따라서 firstObject 프로퍼티로 해당 asset collection을 가져오고 그 안의 모든 asset을 아까 만든 fetchResult라는 리스트에 넣게 됩니다. 여기서 fetchOptions는 리스트에 넣을 때 정렬 방식을 정하는 것인데 여기서는 만들어진 날짜 순으로 정렬하도록 만들었습니다. 이렇게 하면 이제 fetchResult에는 아이폰의 사진이 모두 들어있게 됩니다.
그런데 Apple에서는 이렇게 쉽게 사용자의 사진을 가지고 올 수 없습니다. 누구나 다른 사람의 사진첩에 접근할 수 있다면 보안의 위험이 있기 때문에 사용자에게 허가를 받아야 사진을 가지고 올 수 있습니다. 이러한 허가를 받기 위해서는 다음과 같은 작업을 해줘야 합니다.
위의 사진과 같이 Info.plist에서 저렇게 허가를 요청할 것이라고 설정해주고 실제 허가를 확인하고 받아내는 코드를 작성해보겠습니다.
허가의 종류에는 허가, 불허, 결정하지 않음 을 나타내는 3가지 종류가 있고 만약 허가를 했다면 바로 사진을 가지고 오면 되고 허가되지 않았다면 사진을 가지고 올 수 없습니다. 만약 아직 결정하지 않은 상태라면 허가를 요청하고 이때 허가한다면 사진을 가지고 오면 됩니다.
그 후 앱을 실행하면 위와 같이 허가를 요청하게 됩니다. 이제 사용자가 허가를 해서 사진도 가지고 왔다고 생각해보겠습니다. 이제 가지고 온 사진 한 장 한 장으로 셀을 구성하면 될 것 같습니다.
우선 원래 구현해 두었던 두 메서드를 수정해줘야 합니다. 이젠 아이폰의 사진 수만큼 셀을 만들 것이니까 섹션 당 항목 수를 수정해줍니다. 아이폰에 사진이 없을 경우를 고려해야 하기 때문에 저렇게 코드를 작성하면 됩니다. 그다음 해당 Asset을 가지고 와서 이미지 매니저로 UIImage로 변환해줘서 imageView의 image를 수정해줍니다. 그런 뒤 실행하여 사진첩 접근을 허가해주면 다음과 같은 화면을 만날 수 있습니다.
??? 왜 아무것도 없을까요?? 이는 아까 전의 허가가 잘 됐는지 확인하는 화면을 보면 이해를 할 수 있습니다. 앱 실행과 동시에 컬렉션 뷰의 셀들을 만들게 되는데 이 때는 사진첩 접근을 허가하기 전이기 때문에 fetchResult엔 0개의 사진이 있습니다. 따라서 생성되는 셀도 0이라서 아무것도 만들어지지 않는 것입니다. 허가를 한 뒤엔 fetchResult에는 사진이 있지만 앱에서 새로고침을 해주는 기능을 만들지 않았기 때문에 아무런 변화 없이 그대로 있는 것입니다. 이러한 새로고침은 reloadData() 메서드로 해결할 수 있습니다.
언제 새로고침을 하는 게 좋은지 정하고 코드를 작성하면 됩니다. 저는 사진을 받아온 뒤 받아온 사진으로 셀을 만들기 위해 위와 같은 위치에서 새로고침을 해주었습니다. 이제 다시 실행을 해보겠습니다. 그리고 이번에 앱을 실행할 때는 삭제를 한 뒤 실행을 해야 잘 작동하는지 볼 수 있습니다.
이번엔 실행은 되는데 뭔가 버벅거리지 않으셨나요? 이 이유는 스레드 사용과 있습니다. 이렇게 사용자 인터페이스를 바꾸는 작업은 main 스레드에서만 작업해야 하는데 저희는 그러한 설정을 하지 않았습니다. 위의 사진에서도 보이듯이 오류를 발생시킵니다. 이럴 땐 OperationQueue를 사용해서 코드가 실행될 스레드를 정해주면 됩니다. 이러한 동시성 작업에 대한 정보는 [iOS 앱 개발 기초] Concurrency Programming Guide (동시성 프로그래밍 가이드)를 참고하시길 바랍니다. 어쨌든 이러한 오류를 수정해보겠습니다.
위의 사진처럼 코드를 수정하고 앱 삭제 후 다시 실행해보면 아주 매끄럽게 잘 실행되는 것을 볼 수 있습니다. 이러한 Operation Queue 사용 없이도 시뮬레이터에는 사진이 6개밖에 없어서 별 무리 없이 작동될 수도 있는데 실제 아이폰에 1000개 이상의 사진을 셀로 만드는 작업을 이렇게 수행하지 않으면 로드되는 시간 동안 사용자 입력을 받지 못해서 사용자는 앱이 멈췄다고 생각할 수 있기 때문에 꼭 사용자 인터페이스를 조작하는 작업은 main스레드에서 실행해야 합니다.
이렇게 컬렉션 뷰를 사용하여 사진 앱과 같이 사진을 보이게 하는 방법에 대해 알아봤습니다. 다음 글에서는 여기에서 불러온 사진을 삭제하는 방법에 대해 알아보겠습니다!
'iOS > iOS_Memo' 카테고리의 다른 글
[iOS 앱개발] 컬렉션 뷰 셀 선택하기 - 스토리보드 없이 사진앱 만들기 - 3 (사진삭제) (0) | 2020.08.16 |
---|---|
[iOS 앱개발 프로그래밍] 스토리보드 없이 네비게이션 컨트롤러 만들기 (0) | 2020.08.08 |
[iOS 앱개발] 스토리보드 없이 컬렉션 뷰 만들기 - 스토리 보드 없이 사진앱 만들기 - 1 (0) | 2020.08.05 |
[iOS 앱개발 프로그래밍] 스토리보드(Storyboard) 없이 iOS 앱 개발하기 - 2 (0) | 2020.07.27 |
[iOS 앱개발 프로그래밍] 스토리보드(Storyboard) 없이 iOS 앱 개발하기 - 1 (0) | 2020.07.27 |
- Total
- Today
- Yesterday
- 코테
- operator
- mac
- document
- OS
- 동시성
- 프로그래밍
- Combine
- 테이블뷰
- Xcode
- 코딩테스트
- 앱개발
- 백준
- Swift
- Apple
- operating
- Publisher
- 문법
- pattern
- 스위프트
- IOS
- 자료구조
- DP
- 아이폰
- design
- dfs
- System
- 알고리즘
- OSTEP
- BFS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |