J'ai un assez simple point de vue de la configuration:
Un UIViewController
, avec un enfant UIScrollView
et UIImageView
dans cette UIScrollView
.
J'ai mis l' UIImageView
, avec une hauteur suffisante pour sortir de la zone visible (c'est à dire. plus d' 1024pt
), et de définir l' Bottom space to superview
de la contrainte de mon UIImageView
à une valeur positive (20
par exemple).
L'ensemble de l'installation fonctionne comme prévu, l'image défile bien dans son parent. Sauf lors de l'affichage défile à l'écran (l'effet est plus visible si vous défiler vers le bas de l'écran), puis de disparaître, et apparaît à nouveau (vous êtes passé à un autre point de vue et est venu en arrière), le défilement de la valeur est restaurée, mais le contenu de défilement de la vue est déplacée à l'extérieur de la partie supérieure de la vue parente.
Ce n'est pas simple à expliquer, je vais essayer de le dessiner:
Si vous voulez tester/afficher la source (ou la table de montage, je n'ai pas modifier une seule ligne de code). J'ai mis un peu de démo sur mon github: https://github.com/guillaume-algis/iOSAutoLayoutScrollView
J'ai lu le iOS 6 changelog et l'explication sur ce sujet précis, et pense que c'est de la bonne mise en œuvre de la deuxième option (pure mise en page automatique), mais dans ce cas pourquoi l' UIScrollView
se comporter de manière erratique ? Ai-je raté quelque chose ?
EDIT: C'est exactement le même problème que le #12580434 uiscrollview-mise en page automatique-problème. Les réponses ne sont que des solutions de contournement, comme quelqu'un a trouvé un bon moyen de résoudre ce problème ou est-ce un iOS bug ?
EDIT 2: j'ai trouvé une autre solution, qui permettent de garder la position de défilement dans le même état à l'utilisateur de gauche (c'est une amélioration par rapport à 12580434's accepté de répondre):
@interface GAViewController ()
@property CGPoint tempContentOffset;
@end
@implementation GAViewController
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.tempContentOffset = self.mainScrollView.contentOffset;
self.scrollView.contentOffset = CGPointZero;
}
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
self.scrollView.contentOffset = self.tempContentOffset;
}
Cela veut sauver le décalage en viewWillAppear
, le réinitialiser à l'origine, puis de restaurer la valeur en viewDidAppear
. Le problème semble se produire entre ces deux appels, mais je ne trouve pas son origine.