导航回 UIImagePickerController 的相机视图时冻结

Camera view of UIImagePickerController frozen when navigating back to it

UIImagePickerController 的委托中,当用相机拍摄图像时,另一个视图被推送到导航堆栈上:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    picker.pushViewController(otherViewController, animated: true)
}

otherViewController 中导航栏可见:

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.setNavigationBarHidden(false, animated: false) 
}

当点击导航栏中的< Back按钮时,导航栏再次变得不可见,相机视图出现,但相机图像被冻结,点击底部栏按钮没有效果。

这是为什么?

您在关闭您提供的选择器之前直接推送了一个新视图,这就是为什么当您返回时您的相机图像选择器仍在堆栈中,因为它没有被关闭

dismiss(animated:true, completion: nil)

在此之后,根据需要推送您的新视图。 didFInish 用于获取结果并关闭您使用的选择器传递图像选择或单击到新控制器如果需要但需要关闭选择器

解决方法是不让用户通过将 Back 按钮替换为 Cancel 按钮来向后导航。这会关闭 UIImagePickerController 并自动关闭导航堆栈上的所有更高视图,包括 otherViewController.

// Replace `Back` button with `Cancel` button in the `otherViewController`
navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(self.cancelButtonTapped))

@objc func cancelButtonTapped() {

   // Dismiss the `UINavigationController`, e.g. by calling a delegate function
   // ...
}

因此,用户将不得不从头开始重新开始该过程,而不是仅仅返回。