Search code examples
swiftxcodeuiimageuiimagepickercontroller

UIImagePicker not showing the section of image selected using editor


I am having a hard time displaying an image in my imgaeview. I turned editing on so that the person can center the photo or use a certain part of a photo. When I click choose, the image view doesn't display that section, it scales the whole photo to the image view. Here is my code.

    import UIKit
    import Firebase
    import SDWebImage
    import URLImage

class EPViewController: UIViewController {

@IBOutlet weak var ProfileImage: UIImageView!

    var database: Database!
    var storage: Storage!
    var selectedImage: UIImage?

    var ref:DatabaseReference?
    var databaseHandle:DatabaseHandle = 0

    let dbref = Database.database().reference()
    let uid = Auth.auth().currentUser?.uid



            override func viewDidLoad() {
                super.viewDidLoad()

                // Set the Firebase reference
                ref = Database.database().reference()

                //Retrieve the profile image



                ProfileImage.layer.borderWidth = 3.0
                ProfileImage.layer.masksToBounds = false
                ProfileImage.layer.borderColor = UIColor.white.cgColor
                ProfileImage.layer.cornerRadius = ProfileImage.frame.size.width / 2
                ProfileImage.clipsToBounds = true

                let tapGesture = UITapGestureRecognizer(target: self, action: #selector(EPViewController.handleSelectProfileImageView))
                ProfileImage.addGestureRecognizer(tapGesture)
                ProfileImage.isUserInteractionEnabled = true

               loadProfileImage()

                    }

    @objc func handleSelectProfileImageView() {

            let pickerController = UIImagePickerController()
            pickerController.delegate = self
            pickerController.allowsEditing = true
            present(pickerController, animated: true, completion: nil)

                        }


    @IBAction func Cancel(_ sender: UIBarButtonItem) {
        dismiss(animated: true, completion: nil)

    }

    let user = Auth.auth().currentUser

    let fileData = NSData()

    @IBAction func DoneButton(_ sender: UIBarButtonItem) {
    guard let imageSelected = self.ProfileImage.image else {
        print ("Avatar is nil")
        return
    }

        var dict: Dictionary<String, Any> = [
            "profileImageUrl": "",

        ]

    guard let imageData = imageSelected.jpegData(compressionQuality: 0.5) else {
        return
    }
        let storageRef = Storage.storage().reference(forURL: (I have my correct url here))
        let imageName = NSUUID().uuidString
        let storageProfileRef = storageRef.child("Profile_Images").child(Auth.auth().currentUser!.uid).child("\(imageName).png")

    let metadata = StorageMetadata()
    metadata.contentType = "image/jpeg"
    storageProfileRef.putData(imageData, metadata: metadata, completion:
        { (StorageMetadata, error) in
            if (error != nil) {
                return
            }

            storageProfileRef.downloadURL { (url, error) in
                if let metadateImage = url?.absoluteString {
                    dict["profileImageUrl"] = metadateImage

                    Database.database().reference().child("users").child(Auth.auth().currentUser!.uid).updateChildValues(dict, withCompletionBlock:  {
                        (error, ref) in
                        if error == nil {
                            print("Done")
                            return
                        }

                        }

                    )
                }
            }

            storageRef.updateMetadata(metadata) { metadata, error in
                if error != nil {
                 //Uh-oh, an error occurred!
              } else {
                // Updated metadata for 'images/forest.jpg' is returned
              }
            }

    })


        dismiss(animated: true, completion: nil)

    }

       func loadProfileImage() {

    Database.database().reference().child("users").child(Auth.auth().currentUser!.uid).child("profileImageUrl").observe(.value, with: { (snapshot) in

                        // Get download URL from snapshot
                        let downloadURL = snapshot.value as! String

                        // Create a storage reference from the URL
                        let storageRefP = Storage.storage().reference(forURL: downloadURL)

                        // Download the data, assuming a max size of 1MB (you can change this as necessary)
                        storageRefP.getData(maxSize: 1 * 1024 * 1024) { (data, error) -> Void in
                            // Create a UIImage, add it to the array
                         if let imgData = data {
                             self.ProfileImage.image = UIImage(data: imgData)
                         }
                         print(snapshot)
                          //print(PIUvalue as Any)
                    }
                })

        }

}
extension EPViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
           func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
               //print("did Finish Picking Media")
               if let image = info[UIImagePickerController.InfoKey(rawValue: "UIImagePickerControllerOriginalImage")] as? UIImage{
                   selectedImage = image
                   ProfileImage.image = image
               }
               dismiss(animated: true, completion: nil)
           }
       }

extension UIImageView {
    func load(url: URL, onLoadCompletion: ((_ isImageLoaded: Bool) -> Void)? = nil) {
        self.image = nil
        DispatchQueue.global().async { [weak self] in
            if let data = try? Data(contentsOf: url) {
                if let image = UIImage(data: data) {
                    DispatchQueue.main.async {
                        self?.image = image
                        onLoadCompletion?(true)
                    }
                } else {
                    onLoadCompletion?(false)
                }
            } else {
                onLoadCompletion?(false)
            }
        }
    }
}

I really appreciate all of you guys on here helping me. I am new and trying to get this app to work properly.


Solution

  • I needed to change the code from:

    if let image = info[UIImagePickerController.InfoKey(rawValue: "UIImagePickerControllerOriginalImage")]
    

    to:

    if let image = info[UIImagePickerController.InfoKey(rawValue: "UIImagePickerControllerEditedImage")]