web-dev-qa-db-fra.com

UIScrollview Autolayout Issue

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

Mon problème

  1. Je fais défiler vers le bas View

2.Puis j'appuie sur une autre vue 

3.Puis 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?

30
Mathias Aichinger

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 sur l'origine, mais il semble que les autres réponses le soient également.

40
user1071136

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 ;)

11
kadore

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;
    }
}
6
Kukosk

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.

3
Adam Waite

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];
}
1
Frankenstein

La cause du problème ScrollView était défini sur ContentOffset avant l'application de la mise en forme automatique. la solution est:

Créer une propriété privée

@property (assign,nonatomic) CGPoint scrollviewContentOffsetChange;

Ajouter du code pour voir la méthode

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

- (void)viewWillDisappear:(BOOL)animated {
  [super viewWillDisappear:animated];
  self.scrollviewContentOffsetChange = self.scrollView.contentOffset;
}

- (void)viewDidLayoutSubviews {
  [super viewDidLayoutSubviews];

  self.scrollView.contentOffset = self.scrollviewContentOffsetChange;
}
1
Ratha Hin

avez-vous essayé cela? 

self.automaticallyAdjustsScrollViewInsets = NO;

Dans mon cas, c’est ce qui a résolu mon problème.

1
Lukas

essaye ça

@property (nonatomic, assign) CGPoint scrollViewContentOffsetChange;

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

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    self.scrollViewContentOffsetChange = _scrollView.contentOffset;
}

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    _scrollView.contentOffset = self.scrollViewContentOffsetChange;
}
0
Jimvanced

J'ai eu le même problème. En fin de compte, je fixais une contrainte sur la vue du contenu en alignant le centre y sur le centre y de la super vue. Lorsque j'ai supprimé cette contrainte, cela a très bien fonctionné.

0
mimc