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:
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.
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.
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:
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
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
Tags und Links iphone ios ipad uiview uiscrollview