30 votes

UIScrollview Autolayout Issue

J'ai un problème avec autolayout (peut-être) et mon scrollview!

Mon problème

  1. Je fais défiler Vue

2.Alors je pousse vers une autre vue

3.Alors je reviens en arrière et le scrollview ressemble à cela et je ne parviens pas à faire défiler jusqu'au point le plus élevé (je le vois dans le rebond du scrollview) Scrollview

Quelqu'un peut-il m'aider?

40voto

user1071136 Points 7601

L'extrait de code suivant dans le contrôleur de vue contenant semble également résoudre le problème, sans recourir à des tailles explicites:

 - (void)viewDidDisappear:(BOOL)animated {
  [super viewDidDisappear:animated];
  self.mainScrollView.contentOffset = CGPointZero;
}
 

Il rétablit le décalage du contenu à l'origine, mais il semble que les autres réponses le soient également.

11voto

kadore Points 111

si vous êtes toujours à la recherche d'une réponse, je l'ai trouvée aujourd'hui après deux jours passés à casser la tête. Je vais simplement vous coller le code, mais le plus important est de charger votre scrollView ..

     -(void)viewWillAppear:(BOOL)animated{

    [scrollView setFrame:CGRectMake(0, 0, 320, 800)];
}

-(void)viewDidAppear:(BOOL)animated
{
    [scrollView setScrollEnabled:YES];
    [scrollView setContentSize:CGSizeMake(320, 800)];

}
 

tout cela est chargé avant -(void)viewDidLoad

remarquez que la hauteur est dans les deux cas 800, ce qui est crucial pour résoudre ce problème. Bonne chance pour votre projet ;)

6voto

Kukosk Points 547

J'utilisais la solution d'Adam, mais je commençais à avoir des problèmes lorsque je quittais avec animation: OUI. Dans mon code, l'offset de contenu est défini un certain temps après viewWillAppear (car viewWillAppear semble être trop tôt).

 - (void)viewDidDisappear:(BOOL)animated
{
    self.scrollOffsetToPersist = self.scrollView.contentOffset;
    self.scrollView.contentOffset = CGPointZero;

    [super viewDidDisappear:animated];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [[NSOperationQueue mainQueue] addOperationWithBlock:^
     {
         self.scrollView.contentOffset = self.scrollOffsetToPersist;
     }];
}
 

EDIT: un autre moyen est de le réinitialiser dans viewDidLayoutSubviews :)

 - (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    if(!CGPointEqualToPoint(CGPointZero, self.scrollOffsetToPersist))
    {
        self.scrollView.contentOffset = self.scrollOffsetToPersist;
        self.scrollOffsetToPersist = CGPointZero;
    }
}
 

3voto

Adam Waite Points 2242

Ce n’est pas génial, mais j’ai battu la mise en page automatique (ce n’est certainement pas le bon moyen, mais j’en ai marre d’essayer!) En définissant la taille du contenu dans viewDidAppear après l’autolayout, en définissant le scrollOffset et en conservant le décalage de défilement dans viewDidDisappear, puis le défilement revient à son état persistant dans viewDidAppear.

Comme ça:

 -(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:YES];
    self.scrollView.contentSize = self.scrollViewInnerView.frame.size;
    self.scrollView.contentOffset = [self.scrollOffsetToPersist CGPointValue];

}

-(void)viewDidDisappear:(BOOL)animated{
    [super viewDidDisappear:YES];
    self.scrollOffsetToPersist = [NSValue valueWithCGPoint:self.scrollView.contentOffset];
    self.scrollView.contentOffset = CGPointZero;
}
 

Pas du tout élégant, mais ça marche tellement j'ai pensé partager.

1voto

Frankenstein Points 78

J'utilise un UITabBarController et différentes vues avec mise en page automatique. Les vues sont plus longues que l'écran de l'appareil. Passer d’un onglet à l’autre mène parfois au problème que vous décrivez. Cela n’est arrivé que si la vue a été déroulée avant le changement. J'ai essayé tous les conseils ici mais cela n'a pas fonctionné pour mon cas. Ma solution a été de faire défiler à nouveau avant de quitter la vue. Au moins un moyen de contourner ce bogue dans iOS 6:

 -(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [scrollView setContentOffset:CGPointZero animated:NO];
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X