Le cadre UIScrollView est une taille différente sur iOS 8 vs iOS 7

J'ai mis en place un controller de vue qui affiche simplement une seule image et permet à l'user de pincer pour zoomer / faire un panoramique autour de l'image. Il fonctionne très bien sur iOS 7, mais sur iOS 8, le cadre de la vue déroulante est de taille différente et le résultat final est que l'image est trop agrandie sur l'iPhone et trop éloignée sur l'iPad lorsqu'elle tourne sur iOS 8. C'est parce que la largeur du cadre de vue défilant est de 600pt, ce qui correspond à sa taille dans le storyboard (Universal Storyboard utilisant des classs de taille). Mais j'ai des contraintes d'autolayout qui sont censées assurer que la vue défile s'étire pour remplir l'espace disponible – elle devrait être de 768pt sur iPad. C'est le cas sur iOS 7 mais pas iOS 8.

Voici la configuration: Dans Interface Builder, j'ai un UIViewController qui contient un UIView qui contient un UIScrollView avec des contraintes autolayout de trailing, leading, bottom et top space à la vue d'set. Ensuite, dans viewDidLoad :

  UIImage *image = [UIImage imageNamed:@"image"]; self.imageView = [[UIImageView alloc] initWithImage:image]; self.imageView.contentMode = UIViewContentModeScaleAspectFit; self.imageView.frame = CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height); [self.scrollView addSubview:self.imageView]; self.scrollView.contentSize = image.size; #warning Bug here - scroll view frame is 600pt on iOS 8 - should be 768 for iPad NSLog(@"scroll view frame wid: %f", self.scrollView.frame.size.width); 

J'ai découvert si je mets ce même NSLog dans viewDidAppear la largeur du cadre est correctement 768pt. J'ai essayé de déplacer ce code dans viewWillAppear au lieu de viewDidLoad , mais j'ai le même résultat – c'est 600 dans viewWillAppear aussi. Ainsi, la vue déroulante est correctement étirée pour remplir l'affichage mais pas avant qu'elle n'apparaisse à l'écran. J'ai besoin de la bonne taille d'image avant que l'image n'apparaisse à l'écran afin que je puisse calculer les valeurs de zoom min et max correctes.

Que puis-je faire pour résoudre ce problème et m'assurer qu'il fonctionne pour iOS 7 et 8?

Je l'ai résolu. Pour une raison quelconque, viewDidLoad est trop tôt dans le cycle de vie pour get le cadre ajusté de la vue défilement sur iOS 8, mais de nouveau il fonctionne sur iOS 7. viewWillAppear est également trop tôt, ainsi que viewWillLayoutSubviews .

Pour résoudre le problème, je viens de déplacer le code où j'ai besoin d'utiliser la taille de la vue de défilement pour viewDidLayoutSubviews qui obtient finalement la taille correcte qu'il sera quand il apparaît.

Je luttais aussi beaucoup avec un problème similaire. Je l'ai résolu en changeant la largeur du contentView dans le scrollview par programmation. Dans ViewDidLoad j'appelle cette méthode

 func setupWidthOfContentView(){ let screen = UIScreen.mainScreen().bounds // println("Width: \(screen.size.width) Height: \(screen.size.height)") var constW = NSLayoutConstraint(item: vwContentView, atsortingbute: NSLayoutAtsortingbute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, atsortingbute: NSLayoutAtsortingbute.NotAnAtsortingbute, multiplier: 1, constant: screen.size.width) vwContentView.addConstraint(constW) }