ios - UIImageview not updating once camera picture is taken but when gallery image is selected, camera picture shows for a second
问题描述
我在设置代表并被称为“didFinishPickingMediaWithInfo”的图像视图中显示相机捕获的图像时遇到问题。
我有两个用于用户交互的按钮(相机图片和图库),一旦我从相机拍照,然后从图库中选择任何其他图像;之前拍摄的相机照片会显示一秒钟。我尝试了很多搜索,但到目前为止没有运气。
谁能告诉我我错过了什么。以下是供参考的代码。
@IBAction func cameraButtonPressed(_ sender: UIButton) {
self.openCamera()
}
@IBAction func galleryButtonPressed(_ sender: UIButton) {
self.openGallary()
}
override func viewDidLoad() {
super.viewDidLoad()
initialLayout()
}
override func viewWillAppear(_ animated: Bool) {
self.lblPreview.isHidden = true
self.imageTake.isHidden = true
self.uploadButtonOutlet.isHidden = true
}
//
//MARK: - Internal Methods
func initialLayout() {
self.cameraButtonOutlet.layer.cornerRadius = 20
self.galleryButtonOutlet.layer.cornerRadius = 20
self.uploadButtonOutlet.layer.cornerRadius = 20
}
//MARK: - Open the camera
func openCamera(){
if(UIImagePickerController .isSourceTypeAvailable(UIImagePickerController.SourceType.camera)){
imagePicker.sourceType = UIImagePickerController.SourceType.camera
//If you dont want to edit the photo then you can set allowsEditing to false
imagePicker.allowsEditing = true
imagePicker.delegate = self
imagePicker.cameraCaptureMode = .photo
imagePicker.cameraDevice = .rear
self.present(imagePicker, animated: true, completion: nil)
}
else{
let alert = UIAlertController(title: "Warning", message: "You don't have camera", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
self.present(alert, animated: true, completion: nil)
}
}
//MARK: - Choose image from camera roll
func openGallary(){
imagePicker.sourceType = UIImagePickerController.SourceType.photoLibrary
imagePicker.allowsEditing = true
imagePicker.delegate = self
self.present(imagePicker, animated: true, completion: nil)
}
extension UploadTimesheetViewController: UINavigationControllerDelegate, UIImagePickerControllerDelegate {
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let editedImage = info[UIImagePickerController.InfoKey.editedImage] as? UIImage{
self.lblPreview.isHidden = false
self.imageTake.isHidden = false
self.uploadButtonOutlet.isHidden = false
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0, execute: {
self.imageTake.image = editedImage
self.imageTake.setNeedsLayout()
})
// self.imageTake.image = editedImage
}
//Dismiss the UIImagePicker after selection
picker.dismiss(animated: true, completion: nil)
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.isNavigationBarHidden = false
self.dismiss(animated: true, completion: nil)
}
}
我也尝试了以下代码,但结果仍然相同。
var finalImage:UIImage?
if let image = info[UIImagePickerController.InfoKey.editedImage] as? UIImage {
finalImage = image
}else {
finalImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage
}
self.lblPreview.isHidden = false
self.imageTake.isHidden = false
self.uploadButtonOutlet.isHidden = false
self.imageTake.image = finalImage
//Dismiss the UIImagePicker after selection
picker.dismiss(animated: true, completion: nil)
解决方案
延迟 1 秒后在 imageView 上设置图像。这就是为什么上一张图片显示一秒钟的原因。
消除延迟并立即显示图像。像这样
if let editedImage = info[UIImagePickerController.InfoKey.editedImage] as? UIImage {
self.lblPreview.isHidden = false
self.imageTake.isHidden = false
self.uploadButtonOutlet.isHidden = false
self.imageTake.image = editedImage
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0, execute: {
picker.dismiss(animated: true, completion: nil)
})
})
推荐阅读
- php - Composer 获取安装进度输出
- c# - 从 tfs 取回解决方案
- c# - 在 Unity3d 运行时禁用/启用 ARKit - C#
- python - 正则表达式最后删除不必要的字符串
- android - 由于空格 android,AWS S3 预签名 url 导致 SignatureDoesNotMatch 错误
- sql - SQL查询按最大日期分组
- windows - Windows 10 powershell ise 压缩归档文件在根 .in .zip
- python - 如何优雅地做出自定义断言错误?
- delphi - Delphi 应用程序在 Windows 10 系统上检索不正确的日期格式
- java - 从最大稳定极值区域中提取识别文本