【问题标题】:UIImagePickerController Use Photo / Retake buttons don't workUIImagePickerController 使用照片/重拍按钮不起作用
【发布时间】:2017-10-31 01:32:21
【问题描述】:

我使用默认的 UIImagePickerController 来拍照/从库中选择它们。在某些时候,我会在 UIImagePickerController 上展示其他 ViewController 以自定义所选照片。如果用户选择取消选项,我想让他回到图像选择屏幕 - 在相机源到屏幕的情况下,使用使用照片/重拍按钮。使用自定义按钮关闭 ViewController 后不起作用(它们之前起作用)。

我宁愿不在这里使用 AVFoundation。

下面是一些相关代码:

let storyBuilder = StoryBuilderViewController.storyboardController()

storyBuilder.delegate = self

photoPickerController.present(storyBuilder, animated: true)

这样我展示了我的自定义屏幕。

func resetButtonTapped(_ storyBuilder: StoryBuilderViewController) {
    storyBuilder.dismiss(animated: true)
}

此代码在关闭后运行。

所以,没什么特别的,但按钮停止工作

视图层次结构如下所示:

所以,这个屏幕上什么都没有。按钮属性 isEnabled 设置为 true。 UIImagePickerController 不是零。 isUserInteractionEnabled 为真

我创建了一个 simple project 并出现此错误。它也不起作用。 另外,我刚刚遇到一个案例,当相机完全停止工作时,即使在应用程序重新启动后,日志也充满了错误。只有重启我的手机才有帮助。

更多描述

我有一个开始屏幕 - RootViewController。我需要在 UIImagePickerController 上放置一个摄像头。在用户拍完照片后,我需要展示另一个控制器 - EditViewController(不关闭 UIImagePickerController,所以如果用户想要拍摄另一张照片 - 他只是回去)。我是这样做的:

picker(editController, animated: true) //picker - UIImagePickerController, editController - edit controller

正如我之前所说,我的用户可以返回 - 这是一个问题 - 如果我关闭 editController,UIImagePickerController 上的按钮将不起作用。

请问一些问题,我不明白,为什么很难正确解决我的问题。

【问题讨论】:

  • 您是否尝试过在 Xcode 中使用实时调试视图层次结构?每当按钮对我不起作用时,我都会怀疑我在按钮顶部留下了一个视图(不可见)。
  • @Magnas,检查我的更新
  • @VladHatko 你会分享项目吗?我会尝试解决它然后回复你。
  • 添加了附加信息

标签: ios swift


【解决方案1】:

我已经检查了您的演示代码并进行了某些更改以使其按您的意愿工作。 1) 请查看 ViewController 类代码。

class ViewController: UIViewController {
    fileprivate var photoPickerController = UIImagePickerController()
    let notificationIdentifier: String = "StartCamera"

    override func viewDidLoad() {
        // Register to receive notification
        NotificationCenter.default.addObserver(self, selector: #selector(ViewController.cameraSetUp), name: NSNotification.Name(rawValue: notificationIdentifier), object: nil)
    }

    func cameraSetUp(){
        photoPickerController.sourceType = .camera
        photoPickerController.cameraDevice = .front
        photoPickerController.delegate = self
        present(photoPickerController, animated: true)

    }
    @IBAction func showCamera(_ sender: Any) {
        cameraSetUp()
    }
}

extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        guard let storyboard = storyboard else {return}
        let viewController = storyboard.instantiateViewController(withIdentifier: "EditingViewController")
        picker.dismiss(animated: true)
        present(viewController, animated: true)
    }

    public func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true)
    }
}

2) EditingViewController 类代码

class EditingViewController: UIViewController {
    let notificationIdentifier: String = "StartCamera"

    @IBAction func dismissButtonTapped(_ sender: Any) {
        // Post a notification
        dismiss(animated: true)
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: notificationIdentifier), object: nil)
    }
}

【讨论】:

  • 自定义视图不是视图,而只是另一个视图控制器,我在点击取消按钮时将其删除。您可以轻松地从我附加的示例项目中重现问题。 UIImagePickerController 没有什么
  • 很遗憾,它没有。你再展示一次 imagePicker
  • 是的,我在展示另一个控制器时已经关闭,并且在关闭第二个控制器时再次展示了相机。如果您保持打开状态,Coz 选择器将无法正常工作。
  • 我注意到了 :) 这就是为什么我要问是否有人知道将其保持在正确状态的解决方案
  • 你可以用它玩一点——它不仅仅适用于相机;带有库源的选择器在展示内容后完美运行
【解决方案2】:

所以你的问题是你正在堆叠你的controllers。你不需要这样做。另一件事是您的cancel button 中的viewController 没有任何用途。您还需要持有 UIImagePickerController 的引用,使其成为您的视图控制器的实例属性并呈现它。

代码如下:

import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    let photoPickerController = UIImagePickerController()

    override func viewDidLoad() {
        super.viewDidLoad()
        photoPickerController.delegate = self
    }


    @IBAction func cancelBtnTapped(_ sender: UIButton) {
        showFrontCamera()
    }

    @IBAction func showCamera(_ sender: Any) {
        showFrontCamera()
    }

    func showFrontCamera() {
        photoPickerController.sourceType = .camera
        photoPickerController.cameraDevice = .front
        present(photoPickerController, animated: true)
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        print("didFinishPickingMediaWithInfo")
        if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
            // your image
        }

        picker.dismiss(animated: true){
            // any code after dismissing the controller
        }
    }

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        print("imagePickerControllerDidCancel")
        picker.dismiss(animated: true){
            // any code after dismissing the controller
        }
    }
}

【讨论】:

  • 一开始我没有得到你的解决方案。你真正的建议是做一些像presentingViewController?.dismiss(animated: true)这样的事情。它没有帮助 - 关闭按钮后不起作用
  • @VladHatko 是的,查看我的第一条评论我已经包含了一个指向您的项目的链接以及更新的代码。
  • 您能再检查一下我的问题吗?我现在的任务是在拍摄照片后立即显示编辑屏幕,而不是关闭 UIImagePickerController。我的示例项目只是显示一个问题
  • 你做了什么——写了简单的 UIImagePickerController 流程​​。我也可以这样做。但我的问题与你的回答无关
  • @VladHatko,您真的不清楚您想要什么,而且您的标题非常具有误导性。尝试更新您的问题和标题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多