it-swarm.com.de

UIScrollview Autolayout-Problem

Ich habe ein Problem mit Autolayout (vielleicht) und meinem Scrollview!

Mein Problem

  1. Ich scrolle nach unten View

2. Dann drücke ich zu einer anderen Ansicht 

3. Dann gehe ich zurück und die Scrollansicht sieht so aus, und ich kann nicht zum höchsten Punkt scrollen. (Ich sehe es im Springen der Scrollansicht) Scrollview

Kann mir jemand helfen?

30

Der folgende Codeausschnitt im enthaltenden View-Controller scheint das Problem ebenfalls zu lösen, ohne sich auf explizite Größen zu verlassen:

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

Es setzt den Versatz des Inhalts auf den Ursprung zurück, aber die anderen Antworten scheinen dies zu tun.

40
user1071136

wenn Sie immer noch nach einer Antwort suchen, habe ich sie heute nach zwei Tagen Headbangen an der Wand gefunden. Ich werde nur den Code einfügen, aber das Wichtigste ist, wenn Sie Ihre scrollView laden.

    -(void)viewWillAppear:(BOOL)animated{

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

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

}

das alles wird vor -(void)viewDidLoad geladen

beachten Sie, dass die Höhe in beiden Fällen 800 beträgt, was für die Lösung dieses Problems entscheidend ist. viel Glück mit deinem Projekt;)

11
kadore

Ich habe Adams Lösung verwendet, bekam jedoch Probleme, als ich mit animated: YES abgewiesen wurde. In meinem Code wird der Inhaltsoffset eine Weile nach viewWillAppear gesetzt (da viewWillAppear zu früh erscheint).

- (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;
     }];
}

BEARBEITEN: ein anderer, besserer Weg ist es, es in viewDidLayoutSubviews zurückzusetzen :)

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

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

Das ist zwar nicht so toll, aber ich bin gegen das automatische Layout (definitiv nicht der richtige Weg, aber ich hatte es satt!), Indem ich die Inhaltsgröße nach dem automatischen Layout in viewDidAppear festlegte, das scrollOffset und den Scroll-Offset in viewDidDisappear festlegte und dann einstellte Der Bildlaufversatz wird in viewDidAppear wieder in den permanenten Zustand versetzt.

So was:

-(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;
}

Überhaupt nicht elegant, aber so funktioniert, dachte ich, würde ich teilen.

3
Adam Waite

Ich benutze einen UITabBarController und verschiedene Ansichten mit automatischem Layout. Die Ansichten sind länger als der Bildschirm des Geräts. Das Wechseln von einem Tab zum anderen führt manchmal zu dem von Ihnen beschriebenen Problem. Dies ist nur der Fall, wenn die Ansicht vor dem Wechsel nach unten gescrollt wurde. Ich habe alle Ratschläge hier ausprobiert, aber das hat für meinen Fall nicht funktioniert. Meine Lösung bestand darin, vor dem Verlassen der Ansicht wieder nach oben zu scrollen. Mindestens eine Problemumgehung für diesen Fehler in iOS 6:

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

Das Problem, warum ScrollView vor dem Anwenden von AutoLayout auf ContentOffset gesetzt wurde. Die Lösung ist:

Erstellen Sie privates Eigentum

@property (assign,nonatomic) CGPoint scrollviewContentOffsetChange;

Fügen Sie Code hinzu, um die Methode anzuzeigen

- (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

hast du das probiert 

self.automaticallyAdjustsScrollViewInsets = NO;

In meinem Fall hat dies mein Problem gelöst.

1
Lukas

versuche dies

@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

Ich hatte das gleiche Problem. Es stellte sich heraus, dass ich eine Einschränkung für die Inhaltsansicht auferlegt hatte, die das y-Zentrum an das y-Zentrum des Superview ausrichtete. Wenn ich diese Einschränkung gelöscht habe, hat es gut funktioniert.

0
mimc