UIImageview не обновляется после съемки с камеры, но когда выбрано изображение галереи, изображение с камеры отображается в течение секунды - PullRequest
0 голосов
/ 06 апреля 2020

У меня возникла проблема при отображении снятого камерой изображения в виде изображения, где установлены делегаты, и меня называют «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 Ответ

0 голосов
/ 06 апреля 2020

Вы устанавливаете изображение в imageView с задержкой в ​​1 секунду. Вот почему предыдущее изображение показывается на секунду.

Снимите задержку и покажите изображение мгновенно. Как это

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)
  })

})
...