Uiimagepicker allowsEditing coincé au centre
j'ai un UIImagePicker qui fonctionne parfaitement pour un type de UIImagePickerControllerSourceTypephotolibrary, mais quand J'utilise UIImagePickerControllerSourceTypecamera, la boîte d'édition ne peut pas bouger du centre de l'image. Ainsi, si l'image est plus haute que large, l'utilisateur ne peut pas déplacer la zone d'édition vers le carré supérieur de l'image.
quelqu'un sait pourquoi ce serait le cas? Cela ne se produit que lorsque la source provient de la caméra, pas de la bibliothèque.
Edit: Some Le CODE!!!
if (actionSheet.tag == 2) {
if (buttonIndex == 0) { // Camera
// Check for camera
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] == YES) {
// Create image picker controller
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
// Set source to the camera
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePicker.allowsEditing = YES;
// Delegate is self
imagePicker.delegate = self;
// Show image picker
[self presentViewController:imagePicker
animated:YES
completion:^(void) {
}];
}
}
else if (buttonIndex == 1) { // Photo Library
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary] == YES) {
// Create image picker controller
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
// Set source to the camera
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imagePicker.allowsEditing = YES;
// Delegate is self
imagePicker.delegate = self;
// Show image picker
[self presentViewController:imagePicker
animated:YES
completion:^(void) {
}];
}
}
comme vous pouvez le voir, je les affiche exactement de la même façon, mais l'édition de caméra agit différemment que l'édition de photothèque.
5 réponses
on dirait que ce comportement est juste un bug dans iOS 6... Fondamentalement, vous ne pouvez pas déplacer la boîte d'édition, il est toujours rebondit au milieu, à moins que vous zoomez un peu. Espérons qu'ils réparent ça bientôt.
c'est le comportement par défaut du contrôleur Picker, vous ne pouvez pas le modifier. La seule autre option est de créer votre propre utilité de coupe. Consultez le lien ci-dessous pour un exemple:
je sais, ce n'est pas une bonne solution, mais il fonctionne.
j'ai testé sur iOS8+iPhone5, iOS9+iPhone6sPlus, iOS10+iPhone6, iOS10+iPhone6sPlus.
attention:PLImageScrollView
et PLCropOverlayCropView
UNDOCUMENTED classes.
- (void)showImagePickerControllerWithSourceType:(UIImagePickerControllerSourceType)sourceType {
UIImagePickerController *imagePickerController = [UIImagePickerController new];
imagePickerController.sourceType = sourceType;
imagePickerController.mediaTypes = @[(NSString *)kUTTypeImage];
imagePickerController.allowsEditing = YES;
imagePickerController.delegate = self;
[self presentViewController:imagePickerController animated:YES completion:^{
[self fxxxImagePickerController:imagePickerController];
}];
}
- (void)fxxxImagePickerController:(UIImagePickerController *)imagePickerController {
if (!imagePickerController
|| !imagePickerController.allowsEditing
|| imagePickerController.sourceType != UIImagePickerControllerSourceTypeCamera) {
return;
}
// !!!: UNDOCUMENTED CLASS
Class ScrollViewClass = NSClassFromString(@"PLImageScrollView");
Class CropViewClass = NSClassFromString(@"PLCropOverlayCropView");
[imagePickerController.view eachSubview:^BOOL(UIView *subview, NSInteger depth) {
if ([subview isKindOfClass:CropViewClass]) {
// 0. crop rect position
subview.frame = subview.superview.bounds;
}
else if ([subview isKindOfClass:[UIScrollView class]]
&& [subview isKindOfClass:ScrollViewClass]) {
BOOL isNewImageScrollView = !self->_imageScrollView;
self->_imageScrollView = (UIScrollView *)subview;
// 1. enable scrolling
CGSize size = self->_imageScrollView.frame.size;
CGFloat inset = ABS(size.width - size.height) / 2;
self->_imageScrollView.contentInset = UIEdgeInsetsMake(inset, 0, inset, 0);
// 2. centering image by default
if (isNewImageScrollView) {
CGSize contentSize = self->_imageScrollView.contentSize;
if (contentSize.height > contentSize.width) {
CGFloat offset = round((contentSize.height - contentSize.width) / 2 - inset);
self->_imageScrollView.contentOffset = CGPointMake(self->_imageScrollView.contentOffset.x, offset);
}
}
}
return YES;
}];
// prevent re-layout, maybe not necessary
@weakify(self, imagePickerController);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
@strongify(self, imagePickerController);
[self fxxxImagePickerController:imagePickerController];
});
}
EDIT:eachSubview:
la méthode traverse tous les subviews.
si vous avez défini "afficher l'apparence de la barre d'état basée sur le contrôleur" À non dans l'info.plist et de l'état de la barre de l'apparence que de la lumière à l'aide de
UIApplication.shared.statusBarStyle = .lightContent
ou en utilisant n'importe quelle autre méthode , alors mettez simplement le style comme .par défaut avant de présenter le sélecteur d'images. pour exemple:
imagePicker.allowsEditing = true
imagePicker.sourceType = .photoLibrary
UIApplication.shared.statusBarStyle = .default
present(imagePicker, animated: true, completion: nil)
changez le type de source en fonction de votre besoin en photoLibrary ou de l'appareil photo et dans le bloc d'achèvement de votre did finishpickingmediawithinfo ajouter ce qui suit à l'achèvement du bloc.
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
})}
Apparemment c'est une solution de contournement pour le même.Espérons que cette aide.
une solution qui l'a résolu est d'ajouter une entrée dans info.plist avec " afficher l'apparence de la barre d'état basée sur le contrôleur" est réglé à NO