Notice
Recent Posts
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- Bubble Search
- mrc
- 앱의생명주기
- ReactorKit UnitTest
- 반응형프레임워크
- 카카오맵클론
- UIKit
- HackersRank
- SWIFT
- hackerrank
- Swift디자인패턴
- unittest
- iOS앱 디버깅
- alamofire
- firebase
- Safari Inspector
- algorithm
- TDD
- AutoLayout
- RC
- Swift코딩테스트
- 코딩테스트입문
- Di
- ios면접
- firestore
- 프로그래머스
- RxSwift
- 시험에자주나오는것만
- IOS
- ARC
Archives
- Today
- Total
샘성의 iOS 개발 일지
피커뷰 사용하기 본문
728x90
사용자의 앨범에 접근하여 사용자가 선택한 사진을 불러오는, 피커뷰 사용하기
e.g) 인스타그램 프로필 바꿀때 본인의 앨범에 있는 사진을 고를 수 있는 것
- 피커뷰 기능을 사용할 VC에 PhotosUI import하기
- 해당 VC를 확장해서 PHPickerViewControllerDelegate 채택 / 확장하기
- PHPickerViewControllerDelegate 의 필수 구현 요소(메서드) 구현하기
extension SomeViewController: PHPickerViewControllerDelegate {
// 사진이 선택이 된 후에 호출되는 메서드 (필수 구현 요소)
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
// 피커뷰 dismiss
picker.dismiss(animated: true)
let itemProvider = results.first?.itemProvider
if let itemProvider = itemProvider, itemProvider.canLoadObject(ofClass: UIImage.self) {
itemProvider.loadObject(ofClass: UIImage.self) { (image, error) in
DispatchQueue.main.async {
// 이미지뷰에 표시
self.someView.someImageView.image = image as? UIImage
}
}
} else {
print("이미지 불러오기 실패")
}
}
}
4. VC 안에 ‘피커뷰 설정 + 피커뷰컨트롤러 생성’하는 함수 구현하기
func setupImagePicker() {
// 피커뷰의 기본설정 세팅하기
var configuration = PHPickerConfiguration()
configuration.selectionLimit = 0 // 앨범에서의 선택 무제한으로
configuration.filter = .any(of: [.images, .videos]) // 사진이랑 비디오 선택 가능
// 설정한 기본설정을 기반으로, 피커뷰컨트롤러 생성
let picker = PHPickerViewController(configuration: configuration)
// 피커뷰 컨트롤러의 델리게이트 설정
picker.delegate = self
// 피커뷰 띄우기
self.present(picker, animated: true, completion: nil)
}
5. 제스처 구현하기
- 제스처 : 터치 동작이 안되는 이미지뷰, 라벨 등 위에 올려서 터치 동작이 가능하도록 만드는 것
func setupTapGestures() {
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(touchUpImageView))
someView.someImageView.addGestureRecognizer(tapGesture)
someView.someImageView.isUserInteractionEnabled = true
}
// selector에 들어갈 함수 구현
@objc func touchUpImageView() {
print("이미지뷰 터치")
setupImagePicker() // 피커뷰 세팅 및 설정하는 함수 호출시키기
}
6. viewDidLoad()에 제스처 함수 실행시키기
override func viewDidLoad() {
super.viewDidLoad()
setupTapGestures()
}
7. 사용자의 사진첩에 접근하는 것이기 때문에 info.plist에 privacy description 설정하기
* 전체코드 *
// PhotosUI 불러오기
import PhotosUI
// VC 안에서 피커뷰 설정 및 피커뷰 실행
override func viewDidLoad() {
super.viewDidLoad()
setupTapGestures()
}
func setupTapGestures() {
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(touchUpImageView))
someView.someImageView.addGestureRecognizer(tapGesture)
someView.someImageView.isUserInteractionEnabled = true
}
// selector에 들어갈 함수 구현
@objc func touchUpImageView() {
print("이미지뷰 터치")
// 피커뷰 기본설정 셋팅
var configuration = PHPickerConfiguration()
configuration.selectionLimit = 0
configuration.filter = .any(of: [.images, .videos])
// 기본설정을 가지고, 피커뷰컨트롤러 생성
let picker = PHPickerViewController(configuration: configuration)
// 피커뷰 컨트롤러의 대리자 설정
picker.delegate = self
// 피커뷰 띄우기
self.present(picker, animated: true, completion: nil)
}
// VC 확장해서 피커뷰 채택
extension SomeViewController: PHPickerViewControllerDelegate {
// 사진이 선택이 된 후에 호출되는 메서드 (필수 구현 요소)
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
// 피커뷰 dismiss
picker.dismiss(animated: true)
let itemProvider = results.first?.itemProvider
if let itemProvider = itemProvider, itemProvider.canLoadObject(ofClass: UIImage.self) {
itemProvider.loadObject(ofClass: UIImage.self) { (image, error) in
DispatchQueue.main.async {
// 이미지뷰에 표시
self.someView.someImageView.image = image as? UIImage
}
}
} else {
print("이미지 불러오기 실패")
}
}
}
728x90
'iOS > UiKit' 카테고리의 다른 글
카카오톡 로그인 구현하기 (0) | 2023.05.03 |
---|---|
UIView 모서리 선택적으로 깎기 (0) | 2023.05.02 |
[오픈소스 라이브러리] JGProgressHUD 사용하기 (0) | 2023.04.08 |
[오픈소스 라이브러리] SDWebImage 사용하기 (feat. Firebase) (0) | 2023.04.06 |
날씨API 데이터를 토대로 View의 Constraints 변경하기 (0) | 2023.03.25 |