46 Stimmen

Problem mit uiscrollview setcontentoffset animated scrollt nicht, wenn animated:yes gesetzt ist

Das ist sehr merkwürdig, und ich frage mich, ob jemand eine Idee hat?

Ich versuche, eine UIScrollView in Reaktion auf einen Tastendruck auf dem iPad zu blättern.

Wenn ich es tue:

CGPoint currentOff = scrollView.contentOffset;
currentOff.x+=240;
[scrollView setContentOffset:currentOff animated: NO];

Die Bildlaufansicht springt erwartungsgemäß an die gewünschte Position, aber ich möchte, dass sie scrollt. Allerdings, wenn ich das tue:

CGPoint currentOff = scrollView.contentOffset;
currentOff.x+=240;
[scrollView setContentOffset:currentOff animated: YES];

Dann tut es nichts! Ich habe eine andere Bildlaufansicht, die richtig funktioniert und auf setContentOffset:YES wie erwartet, so dass ich ziemlich verwirrt bin. Jede Idee, warum das Blättern nicht möglich ist, ist sehr willkommen!

Auch, - (void)scrollViewDidScroll:(UIScrollView *)sender überhaupt nichts empfängt, wenn animated:YES verwendet wird, aber aufgerufen wird, wenn animated:NO verwendet wird!

86voto

Philippe Sabourin Punkte 8047

Mir ist das auch passiert und ich habe diese Lösung gefunden:

[UIView animateWithDuration:.25 animations:^{
    self.scrollView.contentOffset = ...;
}];

10voto

aepryus Punkte 4407

Aus eigener Erfahrung kann ich sagen, dass dieses Problem auftritt, wenn setContentOffset: mehrfach aufgerufen wird, bevor die Animation eine Chance hatte, zu laufen.

Ich bin dem Problem noch nicht ganz auf die Spur gekommen, aber ich glaube, dass es sich in etwa so verhält:

setContentOffset:wird animiert aufgerufen und setzt den neuen Offset-Wert. setContentOffset: wird anschließend mit denselben Parametern aufgerufen, wodurch die Animation abgebrochen wird. Außerdem wird festgestellt, dass die neuen Parameter mit den alten übereinstimmen, so dass davon ausgegangen wird, dass nichts getan werden muss, obwohl die Animation noch nicht ausgeführt wurde.

Die obige Lösung unterbricht diesen Zyklus irgendwie, aber vielleicht ist eine weniger plumpe Lösung, Haltepunkte in den Code einzubauen und die Mehrfachaufrufe zu eliminieren.

2voto

makaron Punkte 1575

Schwer zu sagen mit dem Code, den Sie angegeben haben. Und in der Tat, wenn Sie sagen, dass Sie ein Projekt haben, wo alles unter den gleichen Bedingungen funktioniert, dann offensichtlich die Bedingungen sind nicht die gleichen :) Ich konnte das Problem nicht reproduzieren, aber hier sind einige Annahmen für 2 Fälle:

  1. Erstellung von UIScrollView mit Schreibfeder.

    • Vergessen Sie nur nicht, ein IBOutlet zu erstellen und es an das scrollView-Element in der NIB zu binden. In einer einfachen ansichtsbasierten Anwendung habe ich scrollView wie gewünscht animiert: sowohl YES als auch NO. Aber um zu funktionieren

    -(void)scrollViewDidScroll:(UIScrollView *)sender; müssen Sie den Delegierten festlegen:

yourScrollView.delegate = self;

wobei 'self' die Klasse ist, in der Sie Ihre scrollViewDidScroll-Funktion haben; im Übrigen muss diese Klasse dem 'UIScrollViewDelegate'-Protokoll entsprechen.

2. die manuelle Erstellung des UIScrollView-Objekts.

  • hier ist die Idee im Grunde die gleiche, also werde ich nur einen einfachen Code zur Verfügung stellen:

    -(void) creatingScrollView {
        UIScrollView *newScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(20, 5, 280, 44)];
        newScroll.pagingEnabled = YES;
        newScroll.showsVerticalScrollIndicator = NO;
        newScroll.showsHorizontalScrollIndicator = NO;
    
        // ... some subviews being added to our scroll view
    
        newScroll.delegate = self;
        [self.view addSubview:newScroll];
        [newScroll release];
    }

Das funktioniert bei mir. Ich hoffe, das ist hilfreich.

2voto

Marco Punkte 1047

Ich arbeite mit Tableviews, da aepryus solution's sagt: setContentOffset: wird zeitgleich mit anderen Animationen aufgerufen .

In meinem Fall habe ich diese Befehle einfach invertiert:

[tableView reloadData];
[tableView setContentOffset:CGPointMake(240, 0) animated:FALSE];

wie diese

[tableView setContentOffset:CGPointMake(240, 0) animated:FALSE];
[tableView reloadData];

Die Animation startet, nachdem der Inhaltsoffset erfolgreich geändert wurde.

1voto

ChengChieh Punkte 33

Ich stand vor dem gleichen Problem, wiehre die ScrollView scrollt nicht.

Dann habe ich "Use Auto Layout" in der Ansicht deaktiviert, und danach funktioniert die ScrollView.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X