UIScrollView Senden von Berührungen an Unteransichten

8

Hinweis: Ich habe bereits einige Fragen zu den UIScrollView -Schriften an die Untersichten gelesen ( dies enthalten und obwohl ich abgestimmt habe, funktioniert es nicht mehr so, wie ich es mir vorgestellt habe).

Was ich habe: Ich habe ein UIScrollView mit einem benutzerdefinierten UIView (nennen wir es A ) innerhalb dessen sich die gesamte UIScrollView befindet. Ich darf auch eine andere benutzerdefinierte UIViews in das A einfügen.

Auf den Code tue ich das:

%Vor%

Was passiert: Im Moment ist mein einziges Problem, dass ich, wenn ich eine Unteransicht in A verschieben möchte, sie anfassen, warten und dann auch noch tun muss bewege es. Genau wie gesagt hier :

  

Nun ändert sich das Verhalten in Abhängigkeit von der "Länge in der Zeit" des   berühren Sie zuerst die UIView. Wenn es kurz ist, dann das relative Ziehen   wird wie ein Scroll für UIScrollView verwaltet. Wenn es lang ist, dann   Ich bekomme die touchesMoved: -Ereignisse in meinem UIView.

Was ich möchte: Die Unteransichten in A sollten immer Vorrang haben und ich sollte nicht berühren und warten müssen. Wenn ich A und nicht eine Unteransicht davon ankreuze, möchte ich, dass die UIScrollView die Berührungen erhält, wie das Verschieben und Bewegen (der contentSize ist größer als der frame ).

1.0 bearbeiten

Der einzige Grund für mich, diese A Ansicht in einem generischen UIScrollView zu haben, liegt darin, dass ich in der A Ansicht hinein- und herauszoomen kann . Also mache ich folgendes:

%Vor%

Am Anfang hatte ich nicht die A Ansicht in UIScrollView und das einzige, was ich getan habe, war, das A als Unteransicht meiner% co_de hinzuzufügen % root view und alles ist gut gelaufen. Wenn es eine andere Möglichkeit gibt, den Zoom zu vergrößern / verkleinern, werde ich gerne die Antwort akzeptieren.

    
Peres 14.08.2012, 07:38
quelle

4 Antworten

7

Hinweis: Vielen Dank für Ihre Beiträge, insbesondere für Aaron Hayman.

Ich konnte es herausfinden, indem ich Folgendes in der Unterklasse UIScrollView tat:

%Vor%     
Peres 15.08.2012, 11:54
quelle
4

Ich habe das nicht getestet, aber ich glaube, dass die Art und Weise, wie Sie die Berührungsereignisse in Ansicht A (oder den Unteransichten) behandeln, bestimmen wird, wie Berührungsereignisse weitergeleitet werden. Insbesondere wenn Sie versuchen, die Methoden touchesBegan , touchesMoves , touchesEnded usw. anstelle von UIGestureRecognizer zu verwenden, werden Sie die Berührungen nicht so erhalten, wie Sie möchten. Apple gestaltet die UIGestureRecognizer so, dass Probleme wie die, mit der Sie konfrontiert sind, behandelt werden. Insbesondere verwendet UIScrollView UIPanGestureRecognizer , um das Scrollen zu verarbeiten. Wenn Sie UIPanGestureRecognizer zu jeder der Unteransichten von View A hinzufügen, sollte jedes "Panning", das in einer dieser Unteransichten auftritt, an diese Unteransicht anstatt an UIScrollView gesendet werden. Wenn Sie jedoch nur die Methoden "rohe" touches verwenden, wird UIPanGestureRecognizer in UIScrollView niemals abgebrochen.

Im Allgemeinen ist es fast immer am besten, ein UIGestureRecognizer zu verwenden, anstatt die Berührungen direkt in der Ansicht zu bearbeiten. Wenn Sie Berührungen benötigen, die auf eine Weise bearbeitet werden, die kein Standard UIGestureRecognizer bieten kann, erstellen Sie die Unterklasse UIGestureRecognizer und bearbeiten Sie die Berührungen dort. Auf diese Weise erhalten Sie die gesamte Funktionalität eines UIGestureRecognizer zusammen mit Ihrer eigenen benutzerdefinierten Touch-Verarbeitung. Ich glaube wirklich, dass Apple für UIGestureRecognizer die meisten (wenn nicht alle) benutzerdefinierten Codeverarbeitungscodes, die Entwickler auf UIView verwenden, ersetzen soll. Es ermöglicht die Wiederverwendung von Code und es ist viel einfacher zu handhaben, wenn man mindert, welcher Code welches Touch-Ereignis verarbeitet.

    
Aaron Hayman 14.08.2012 12:01
quelle
0

Jacky, ich brauchte eine ähnliche Sache: Innerhalb eines Gebäudeplans (Ihr A, in meinem Fall eine Unterklasse von UIScrollView), lassen Sie den Benutzer Objekte platzieren und ihre Größe ändern (nennen Sie sie Bs). Hier ist eine Skizze, wie ich zu diesem Verhalten gekommen bin:

  • Legen Sie in der Superview-Methode (A) initWithFrame: diese beiden fest:

    %Vor%

    Dies stellt sicher, dass Taps auf B sofort auf die Bs geroutet werden.

  • Halten Sie im eingebetteten B den Superview A vom Abbrechen von Taps ab, damit es nicht mit einer auf dem B gestarteten Geste interferiert.

    Suchen Sie in der Methode touchesBegan: die Ansichtshierarchie nach oben (mithilfe der superview -Eigenschaft der Ansichten), bis Sie UIScrollView finden, und legen Sie canCancelContentTouches auf NO fest. Merken Sie sich den von Ihnen geänderten Überblick und stellen Sie diese Eigenschaft in den Methoden touchesEnded und touchesCancelled von B. wieder her.

Es würde mich interessieren, ob das auch für Sie funktioniert. Viel Glück!

nobi

    
virtualnobi 14.08.2012 09:25
quelle
0

Ich denke, du solltest besser "touchesBegan, touchesMoved, touchesEnded" verwenden, um die Veranstaltung zu bestehen.

können Sie so machen:

Sie sollten eine Hauptansicht erstellen. Es hat 2 Eigentum. Einer ist yourScrollView A und One ist yourCustomView.

%Vor%

und schreibe dann deine Berührungsmethode so in die mainView.m (ignoriere die scrollView-Anweisung)

%Vor%

Der letzte Schritt: Übergeben Sie das Ereignis an die Unteransicht der scrollView (Ihr A).

%Vor%

möchte Ihnen helfen

    
cloosen 14.08.2012 10:20
quelle

Tags und Links