导航回 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
// ...
}
因此,用户将不得不从头开始重新开始该过程,而不是仅仅返回。
在 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
// ...
}
因此,用户将不得不从头开始重新开始该过程,而不是仅仅返回。