user2397282
user2397282

Reputation: 3818

Can't pan image taken from camera with UIImagePicker

I'm using a UIImagePicker to get the user to take a photo. When the photo is taken, I want them to pan and zoom the image around to fit inside the cropped box so that the image is stored as a square.

However, when cropping the image, it seems as though you cannot move it to the top and bottom of a (portrait) image (left and right if landscape).

I have tried searching but there doesn't seem to be much information, but it seems like a massive issue.

Can someone help?

This is the very small amount of code I'm using:

let imagePicker = UIImagePickerController()

imagePicker.allowsEditing = true
imagePicker.sourceType = UIImagePickerControllerSourceType.camera

present(imagePicker, animated: true, completion: nil)

There's obviously more code but this is the main part.

EDIT with photo:

enter image description here

So I want to be able to move the photo around/zoom in to select any square portion to save. However, I cannot move it from this position/ keeps snapping back.

I can zoom in, but it still restricts me from the top and bottom edges.

Again, it works with the photoLibrary.

Upvotes: 9

Views: 3047

Answers (4)

SwiftNinja95
SwiftNinja95

Reputation: 157

If you have set "View controller-based status bar appearance" to NO in info.plist and set status bar appearance as light using

UIApplication.shared.statusBarStyle = .lightContent

or using any other method , Then simply set the style as .default before presenting the image picker. for Eg:

imagePicker.allowsEditing = true
imagePicker.sourceType = .photoLibrary
UIApplication.shared.statusBarStyle = .default
present(imagePicker, animated: true, completion: nil)

Change the source type according to your need either as photoLibrary or camera and in completion block of your didFinishPickingMediaWithInfo add the following to completion block.

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    //let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage

    var pickedImage : UIImage?
    if let img = info[UIImagePickerControllerEditedImage] as? UIImage
    {
        pickedImage = img

    }
    else if let img = info[UIImagePickerControllerOriginalImage] as? UIImage
    {
        pickedImage = img
    }
    dismiss(animated: true, completion: {
        UIApplication.shared.statusBarStyle         = .lightContent
    })}

Apparently this is a workaround for the same.Hope this helps.

Upvotes: 0

Fogmeister
Fogmeister

Reputation: 77651

This is a bug that was introduced in iOS 6 and hasn't been fixed yet.

A radar was raised in 2012 for this but closed by Apple. I managed to get it opened again and have been pestering Apple devs in my contacts for the past 6 months.

http://openradar.appspot.com/12318774

Until this is fixed by Apple the only option is to use a third party control or do it yourself.

Here is the radar I opened...

http://openradar.appspot.com/28260087

Upvotes: 9

iAviator
iAviator

Reputation: 1447

I have used the solution provided at below link:-

https://github.com/Hipo/HIPImageCropper

It handles the landscape and potrait allignment of the image and provides zoom in and zoom out with crop functionality.

Hope this helps.

Upvotes: 0

Jarad Kears
Jarad Kears

Reputation: 114

I know you said it already zooms but you may just need to adjust the bounds for that.

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    image.image = info[UIImagePickerControllerEditedImage] as? UIImage
    self.dismiss(animated: true, completion: nil)
}

You may also need to use CGRect to set the image correctly in the screen. It should be centered. If you are using and iphone 5 the dimensions 640 x 1136.

This happens because the width or the height of the image gets maxed out to the screen.

Upvotes: 0

Related Questions