Le zoom avec UIScrollView dans un environnement strictement autolayout ne semble pas fonctionner.
C'est d'autant plus frustrant que les notes de mise à jour d'iOS 6 m'ont certainement laissé penser qu'il en serait ainsi lorsqu'il est question d'une "approche de mise en page automatique pure", ici http://developer.apple.com/library/ios/#releasenotes/General/RN-iOSSDK-6_0/_index.html
J'ai consulté les diapositives de la WWDC 2012 pour les sessions 202, 228 et 232 et je n'ai pas trouvé de réponse à cette question.
La seule question que j'ai vue sur Internet concernant spécifiquement ce problème est la suivante Zoom de UIScrollView avec Auto Layout mais il ne fournit pas le code du problème et il n'y a pas de réponse.
Cet utilisateur https://stackoverflow.com/users/341994/matt a donné de nombreuses et excellentes réponses aux questions relatives à l'autolayout de UIScrollView et a même créé un lien vers le code sur le hub git, mais je n'ai pas été en mesure de trouver quelque chose qui réponde à cette question.
J'ai tenté de réduire cette question au strict minimum pour qu'elle soit claire.
J'ai créé une nouvelle application à vue unique avec un storyboard, et je n'ai fait aucun changement dans le constructeur d'interface.
J'ai ajouté un grand fichier image au projet "pic.jpg".
SVFViewController.h
#import <UIKit/UIKit.h>
@interface SVFViewController : UIViewController <UIScrollViewDelegate>
@property (nonatomic) UIImageView *imageViewPointer;
@end
SVFViewController.m
#import "SVFViewController.h"
@interface SVFViewController ()
@end
@implementation SVFViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UIScrollView *scrollView = [[UIScrollView alloc] init];
UIImageView *imageView = [[UIImageView alloc] init];
[imageView setImage:[UIImage imageNamed:@"pic.jpg"]];
[self.view addSubview:scrollView];
[scrollView addSubview:imageView];
scrollView.translatesAutoresizingMaskIntoConstraints = NO;
imageView.translatesAutoresizingMaskIntoConstraints = NO;
self.imageViewPointer = imageView;
scrollView.maximumZoomScale = 2;
scrollView.minimumZoomScale = .5;
scrollView.delegate = self;
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(scrollView,imageView);
NSLog(@"Current views dictionary: %@", viewsDictionary);
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView]|" options:0 metrics: 0 views:viewsDictionary]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView]|" options:0 metrics: 0 views:viewsDictionary]];
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[imageView]|" options:0 metrics: 0 views:viewsDictionary]];
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[imageView]|" options:0 metrics: 0 views:viewsDictionary]];
}
-(UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView{
return self.imageViewPointer;
}
@end
Remarquez que j'ai fait un effort particulier pour que ce code ressemble le plus possible à l'exemple de code fourni dans les notes de mise à jour d'iOS 6, en faisant juste le strict minimum pour implémenter le zoom.
Alors, le problème ?
Lorsque vous exécutez cette application et que vous effectuez un panoramique dans la vue défilante, tout est bon. Mais lorsque vous effectuez un zoom, le problème est évident : l'image vacille d'avant en arrière et son positionnement dans la vue défilante devient de plus en plus incorrect à chaque zoom.
Il semble qu'il y ait une bataille en cours pour le décalage du contenu de l'imageView, il semble qu'il soit défini à des valeurs différentes par deux choses différentes à chaque "zoom". (un NSLog de la propriété "content offset" de l'imageView semble le confirmer).
Qu'est-ce que je fais de mal ici ? Quelqu'un sait-il comment mettre en œuvre le zoom dans un UIScrollView dans un environnement purement autolayout ? Existe-t-il un exemple de cela quelque part ?
Aidez-moi, s'il vous plaît.
0 votes
Je suis tombé sur ce ( developer.apple.com/library/ios/#samplecode/PhotoScroller/ ), ce qui me préoccupe plus que de répondre à ma question. Oui, il implémente le zoom UIScrollView en utilisant autolayout, mais il le fait en sous-classant UIScrollView d'une manière compliquée que je ne peux pas suivre. Il doit y avoir un moyen plus simple de le faire...
1 votes
J'ai le même problème. L'intégration d'un UIImageView à l'intérieur d'un UIScrollView n'est pas aussi simple qu'elle ne l'était auparavant avec autolayout.