표시할 때 sourceType 전환

17898 단어 SwiftiOS

TL;DR


표시된 UIImagePickerController의 변경이 순조롭게 진행되지 않음
→ 카메라 부팅, 포토 라이브러리 부팅 시 버튼sourceType을 눌러 확인
- 또는 인스턴스 재생성

하고 싶은 일


나는 촬영한 영상을 얻기 위해 카메라를 가동하고 싶다.
또한 포토 라이브러리에서 이미지를 옵션으로 선택할 수 있기를 바랍니다.

해본 일


실시 방침

sourceType 시동 카메라
포토 라이브러리 버튼을 클릭한 경우UIImagePickerController의 경우UIImagePickerController에서 sourceType로 변경camera

출처


원래photoLibrary사용하던UIImagePickerController카메라 표시 중에 포토 라이브러리 버튼을 설정할 예정입니다.
먼저 테스트를 위해 취소 버튼cameraOverlayView으로 전환 pickerFirstViewController.swift
import UIKit
import Photos

class FirstViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    var picker: UIImagePickerController!

    override func viewDidLoad() {
        super.viewDidLoad()
        // 許可リクエスト
        AVCaptureDevice.requestAccess(for: AVMediaType.video) { (Bool) in
            return
        }
    }

    /// Picker起動ボタン
    ///
    /// - Parameter sender:
    @IBAction func btn1_TouchUpInside(_ sender: Any) {
        pickerInit(type: UIImagePickerController.SourceType.camera)
    }

    /// Picker初期化
    ///
    /// - Parameter type: sourceType
    func pickerInit(type: UIImagePickerController.SourceType){
        self.picker = UIImagePickerController()
        self.picker.sourceType = type
        self.picker.delegate = self

        self.picker.navigationBar.tintColor = UIColor.white
        self.picker.navigationBar.barTintColor = UIColor.gray

        present(self.picker, animated: false, completion: nil)
    }

    // MARK: - UIImagePickerControllerのデリゲートメソッド

    /// 画像選択時
    ///
    /// - Parameters:
    ///   - picker:
    ///   - info:
    private func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        // モーダルビューを閉じる
        self.picker.dismiss(animated: true, completion: nil)
    }

    /// キャンセル時
    ///
    /// - Parameter picker:
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        // 表示中のpickerのsourceTypeを切り替えるだけ
        if picker.sourceType == UIImagePickerController.SourceType.photoLibrary {
            self.picker.sourceType = UIImagePickerController.SourceType.camera
        }
        else {
           self.picker.sourceType = UIImagePickerController.SourceType.photoLibrary
        }
    }
}

결실


스쿠시


1. 시작할 때

2. Picker 부팅(카메라)

3.sourceType 전환(포토 라이브러리)

4.sourceType 전환(카메라)

5.sourceType 전환(포토 라이브러리)

!!!?!?!!???!!?!??!?!???wwwwwwwww
카메라는 보통인데 두 번째로 포토라이브러리가 나오면 아무것도 없어!이게 뭐야!!

조사하다.


지면 디자인 한 번 볼까...
1. 정상 상태

2.이상 시
sourceType 사라졌어...!?
누구세요?누구세요?무서워!
징징거려도 안 나오더니 보고도 잘 모르겠다.

그럼 어떡해.


한 번PUPhotoPickerHostViewController을 했는데 도르르르UIImagePickerController가 바뀌었어요. 맛이 없을 거예요.
사진 촬영과 사진 라이브러리의 선택은 모두 버튼을 눌러 분리하는 응용이다.

실시 방침

sourceType 시동 카메라
사진 라이브러리 단추를 눌렀을 때, 표시된 UIImagePickerController 가 아닌 UIImagePickerController 실례를 새로 생성했습니다.

출처


원래 카메라 디스플레이에 사진 라이브러리 단추를 설정하려고 하였으나, 아래는 생략한다
SecondViewController.swift
import UIKit
import Photos

class SecondViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate{

    var picker: UIImagePickerController!

    override func viewDidLoad() {
        super.viewDidLoad()
        // 許可リクエスト
        AVCaptureDevice.requestAccess(for: AVMediaType.video) { (Bool) in
            return
        }
    }

    /// Picker起動ボタン
    ///
    /// - Parameter sender:
    @IBAction func btn1_TouchUpInside(_ sender: Any) {
        pickerInit(type: UIImagePickerController.SourceType.camera)
    }

    /// Picker初期化
    ///
    /// - Parameter type: sourceType
    func pickerInit(type: UIImagePickerController.SourceType){
        self.picker = UIImagePickerController()
        self.picker.sourceType = type
        self.picker.delegate = self

        self.picker.navigationBar.tintColor = UIColor.white
        self.picker.navigationBar.barTintColor = UIColor.gray

        present(self.picker, animated: false, completion: nil)
    }

    // MARK: - UIImagePickerControllerのデリゲートメソッド

    /// 画像選択時
    ///
    /// - Parameters:
    ///   - picker:
    ///   - info:
    private func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

        // モーダルビューを閉じる
        self.picker.dismiss(animated: true, completion: nil)
    }

    /// キャンセル時
    ///
    /// - Parameter picker:
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        // 一旦表示中のモーダルを閉じる
        self.picker.dismiss(animated: false, completion: nil)

        // sourceTypeを切り替えて再度インスタンス生成から行う
        if picker.sourceType == UIImagePickerController.SourceType.photoLibrary {
            pickerInit(type: UIImagePickerController.SourceType.camera)
        }
        else {
            pickerInit(type: UIImagePickerController.SourceType.photoLibrary)
        }
    }
}

결실


몇 번을 전환하든지 카메라, 사진 라이브러리를 정상적으로 표시할 수 있다.

총결산


사실대로 말하면 나는 요인을 잘 모른다.
표시된 sourceTypesourceType 변경은 가이드라인을 따르지 않았나요...?
당분간 이 방법으로 해결했지만 좀 더 쉬운 방법이 있는 것 같아요.

좋은 웹페이지 즐겨찾기