2009-07-06 6 views
5

Ich habe eine UITextView, die viel Inhalt hat. Ich habe eine Schaltfläche, die UITextView ermöglicht automatisch + 10 Pixel in einer NSTimer Schleife blättern:iPhone Auto-Scroll-UITextView, aber manuelle Scrolling auch

scrollPoint = CGPointMake(scrollPoint.x, scrollPoint.y + 10); 
[textView setContentOffset:scrollPoint animated:YES]; 

Das ist wirklich gut funktioniert, wie die Animation die Scroll ziemlich glatt macht. Ich möchte erlauben, dass der Benutzer vorwärts oder rückwärts blättert, indem er mit dem Finger scrollt. Aufgrund dieses Codes nach der Bildlaufanimation springt die Bildlauffunktion jedoch dorthin zurück, wo sie automatisch gescrollt hätte.

Ich muss die ScrollPoint-Variable nach einem manuellen Scroll zurücksetzen, aber ich bin mir nicht sicher, wie das geht. Ich habe versucht, die Delegiertenmethode

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView; 

zu implementieren, aber diese Methode wird auch auf meinem automatischen Bildlauf ausgelöst.

Irgendwelche Ideen?

Antwort

12

könnten Sie einfach es relativ bewegen machen, wo es ist:

scrollPoint = textView.contentOffset; 
scrollPoint.y= scrollPoint.y+10; 
[textView setContentOffset:scrollPoint animated:YES]; 
+0

Mann Ich hatte meinen Kopf WEG zu nah an diesem Problem. Ihre Lösung funktioniert wunderbar! Vielen Dank. –

+0

Es scrollt glatter mit "animiert: NEIN" – DerWOK

0

Ich denke, durch die effektive 2 Möglichkeiten, die den Inhalt Ihrer Art des Kampfes gegen die API zu blättern.

Wenn ich richtig verstehe, haben Sie in Ihrem aktuellen Setup eine Schaltfläche, die eine Animation auslöst.

Wenn Sie auf diese Weise scrollen, wird eine Animation erstellt und in einem anderen Thread ausgeführt. Während die Animation ausgeführt wird, wird die Präsentationsebene geändert. Der tatsächliche Inhaltsoffset ist jedoch NOT festgelegt, bis die Animation abgeschlossen ist.

Dies funktioniert gut und transparent, bis Sie versuchen, die gleiche Eigenschaft zu animieren, während es bereits animiert wird.

Normalerweise löschen Sie in diesem Fall die vorhandenen Animationen, setzen den Rahmen auf die Präsentationsschicht (aktuelle Bildschirmposition) und übernehmen dann die neue Animation.

Sie verwenden jedoch eine bequeme Methode der textView (setContentOffset: animierte :). Wenn Sie das tun, geben Sie feine Animationssteuerung für weniger Codezeilen auf.

Ich denke, dass das Stoppen eines laufenden Scrolls schwer oder unmöglich sein kann, wenn man die höheren APIs benutzt. Dies bedeutet, dass Sie zumindest versuchen müssen, einen UIView-Animationsblock zu erstellen und höchstwahrscheinlich eine CAAnimation erstellen.

Die einfachere Lösung besteht darin, mit einer Methode des Scrollens Ihr TextView zu vereinbaren. Die HIG favorisiert direkte Manipulation am iPhone. Auch wenn es einfach ist, das Scrollen in beiden Richtungen durchzuführen, würde ich empfehlen, die Button-Methode zu ignorieren und einfach die direkte Manipulation zu verwenden, die Sie gerade implementieren.

2

Ich wollte das gleiche tun, was Sie Ben zu tun versuchen, aber ich fand, dass die Animation in Bezug auf die Anzeigezeit zu kostspielig war und den Zweck zu vereiteln schien. Ich habe damit herumgespielt und festgestellt, dass der folgende Code genau das tut, was Sie tun wollten und das System überhaupt nicht beeinträchtigt.

Einrichtung

if (autoscrollTimer == nil) { 
    autoscrollTimer = [NSTimer scheduledTimerWithTimeInterval:(35.0/1000.0) 
                target:self 
                selector:@selector(autoscrollTimerFired:) 
                userInfo:nil 
                repeats:YES]; 
} 

Der Schlüssel ist, die Animation OFF beim Drehen und die in kleineren Inkrementen versetzt bewegt. Es scheint schneller zu laufen und stört das manuelle Scrollen nicht.

- (void)autoscrollTimerFired:(NSTimer*)timer { 
    CGPoint scrollPoint = self.textView.contentOffset; 
    scrollPoint = CGPointMake(scrollPoint.x, scrollPoint.y + 1); 
    [self.textView setContentOffset:scrollPoint animated:NO]; 
} 

Ich bin ziemlich neu in Objective-C und iphone Entwicklung also, wenn jemand mit mehr Erfahrung ein Problem mit diesem Ansatz sieht würde ich ein Feedback zu schätzen wissen.

+0

In meinem Fall mochte ich die Animation, aber wenn Sie nur um 1 Pixel bewegen, dann sollte es glatt sein. Aus anderen Gründen habe ich jedoch ein WebView verwendet, das nicht von der Scroll-Ansicht übernommen wird. Daher musste ich Javascript verwenden, um das Scrollen durchzuführen. Jawohl. Es war etwas abgehackt, aber es war ein lohnender Kompromiss. –