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!

1voto

ben Punkte 3066

Lösung für Xamarin.iOS

InvokeOnMainThread(() =>
{
  scrollView.SetContentOffset(new PointF((page * UIScreen.MainScreen.Bounds.Width), 0), true);
});

Dies kann auch gelöst werden durch UIView.Animate

UIView.Animate(
    duration: .25,
    animation: () =>
    {
       scrollView.SetContentOffset(new PointF((value * UIScreen.MainScreen.Bounds.Width), 0), true);
    }
);

1voto

Alvin George Punkte 13610
func scrollViewDidScroll(scrollView: UIScrollView) {

    dispatch_async(dispatch_get_main_queue(),{

        UIView.animateWithDuration(0.10, animations: { () -> Void in

            let loginScrollViewCurrentPosition:CGPoint = CGPointMake(self.loginScrollView.contentOffset.x, self.loginScrollView.contentOffset.y) as CGPoint
            self.loginScrollView.setContentOffset(loginScrollViewCurrentPosition, animated: true)

            })
    })

}

0voto

Dado Punkte 1097

Ich hatte das gleiche Problem, in meinem Fall wurde ich auch abgefangen:

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {...}

Diese Methode wird unmittelbar danach aufgerufen: (Es wird nicht bis zum Ende der Animation gewartet):

[scrollView setContentOffset:currentOff animated: YES];

Das heißt, wenn Sie eine Logik haben, die auf das Ende der Animation "wartet" und Sie scrollViewDidEndScrollingAnimation abfangen, wird das Ergebnis undefiniert sein, d.h. die Animation wird vorzeitig beendet.

EDIT: Die akzeptierte Lösung/Workaround:

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

Auch "funktioniert" in meinem Szenario, weil die Einstellung der contentOffset direkt nicht scrollViewDidEndScrollingAnimation aufrufen

-2voto

mtompson Punkte 261

Sie könnten es versuchen:

[scrollView setContentOffset:CGPointMake(240, 0) animated:YES];

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