2008-12-20 14 views
13

Ich benutze UIScrollView, um große (größer als 320px) UI auf dem iPhone zu machen.Wie Abbrechen Bildlauf in UIScrollView

Ich habe eine Instanz von UIScrollView erstellt und einige Unteransichten hinzugefügt. Das Problem ist, dass ich das Scrollen nur dann aktivieren möchte, wenn der Benutzer außerhalb von Unteransichten berührt, aufhören zu scrollen, wenn der Benutzer eine der Unteransichten berührt.

Ich habe Dokumente gelesen und versucht, Beispiele zu finden, aber ich kann keinen guten Hinweis finden. Wenn Sie eine Idee haben, bitte helfen Sie mir.

+0

@Chris Hanson: Warum haben Sie das iPhone und UIScrollView von den Tags entfernt? Das sind die richtigen Tags - Kakao-Touch kann hinzugefügt werden, sollte aber hier nicht alleine stehen. – Emil

+0

Ich habe diese Tags nicht entfernt oder bearbeitet :( –

+0

Weil ich damals den Tag Space mit Namen von Klassen und redundanten Informationen verschmutzt habe, war das keine gute Idee. Es ist immer noch nicht, ich gab einfach auf Dieser Mist zu reparieren –

Antwort

5

Wenn Sie Berührungen innerhalb einer der Unteransichten von UIScrollView erkennen möchten, müssen Sie UIScrollView ableiten und die Methoden touchesShouldBegin und touchesShouldCancelInContentView überschreiben, die speziell für diesen Zweck erstellt wurden.

Darüber hinaus gibt es keine Möglichkeit, Berührungen in den Unteransichten zu erkennen, da UIScrollView dazu neigt, alle Berührungen selbst zu behandeln und sie nicht an die Unteransichten weiterzuleiten.

Alles Gute.

+0

Vielen Dank für Ihre Antwort. Ich versuchte TouchShouldBegin/touchesShouldCancel ... Methoden zu überschreiben, aber diese Methoden wurden nie aufgerufen. Vielleicht stimmt etwas mit meiner Programmierung nicht, aber ich kann aufhören zu scrollen, indem ich die Berührungen berühreBeginge/touchesMoved/touchedEnded-Methoden. Vielen Dank! –

+0

Machst du das in einer Unterklasse auf UIScrollView? Die Methoden werden nur dann aufgerufen. Anstelle des UIViewController, der eine UIView als Ansicht verwendet, sollte er eine Unterklasse von UIScrollView als Ansicht verwenden. – lostInTransit

+0

Ja, ich habe dies in einer Unterklasse von UIScrollView versucht. Ich habe ein Problem in meinem Gerät (nur übersteuernBegan ...), also versuche ich immer den Grund zu finden, warum die touchShouldBegin Methode nie aufgerufen wurde. –

35

UIScrollView verfügt über eine scrollEnabled Eigenschaft, mit der Sie programmgesteuert das Scrollen deaktivieren können. Es hat auch einen Delegaten (UIScrollViewDelegate), mit dem Sie Ereignisse wie Scrollen Start/Ende sehen können. Es scheint, dass Sie in der Lage sein sollten, etwas mit diesen Optionen in irgendeiner Weise kombiniert zu kochen.

+0

Vielen Dank für Ihre Antwort Ich werde Ihre Lösung jetzt versuchen –

+0

Dies ist die beste Lösung, @ Stephen: Sie sind gut :) – hungbm06

+2

Schöne Antwort, vage, aber genug, um loszulegen. +1 –

2

Sie können UIScrollViewController auch untergliedern und die Methoden touchesBegan, touchesMoved und touchseended überschreiben. Wenn Ihre Implementierung die Superklassenimplementierung niemals aufruft, wird kein Bildlauf ausgeführt.

+0

Vielen Dank für Ihre Antwort. Ich habe deinen Vorschlag ausprobiert und es hat funktioniert !! –

4

Die einfachste Möglichkeit ist delayContentTouches für die Scrollview NO zu setzen. Auf diese Weise wird das Standardverhalten so eingestellt, dass alles, was ein UIControl ist, die Berührungen sofort an das Steuerelement weiterleitet und alles andere scrollt.

+2

Wenn dies auf NO gesetzt ist, ist das Verhalten das Gegenteil von dem, was das OP will. Wenn dies auf JA eingestellt ist, ist es nicht viel besser :) –

5

Die Eigenschaft, an der Sie wirklich interessiert sind - und ich teste dies gerade jetzt, weil ich das gleiche Problem habe, das Sie tun - ist canCancelContentTouches.

Wenn der Wert dieser Eigenschaft ist NO, die Scroll-Ansicht blättern nicht unabhängig von Fingerbewegung, sobald die Seitenverfolgung beginnt.

Wenn dies nicht, dass Sie die Ergebnisse nicht geben Sie wollen, Unterklasse UIScrollView und überschreiben die touchesShouldBegin:withEvent:inContentView Verfahren, das ist es, was die akzeptierte Antwort vermuten lässt.