Reputation: 3818
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:
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
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
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
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
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