Mein Problem: Ich habe eine Übersicht EditView
, die im Grunde den gesamten Anwendungsrahmen einnimmt, und eine Unteransicht, MenuView
die nur die unteren ~ 20% MenuView
einnimmt und dann eine eigene Unteransicht enthält, ButtonView
die sich tatsächlich außerhalb der MenuView
Grenzen befindet (so etwas wie :) ButtonView.frame.origin.y = -100
.
(Hinweis: EditView
Enthält andere Unteransichten, die nicht Teil der MenuView
Ansichtshierarchie sind, aber die Antwort beeinflussen können.)
Sie kennen das Problem wahrscheinlich bereits: Wann ButtonView
innerhalb der Grenzen von MenuView
(oder genauer gesagt, wenn meine Berührungen innerhalb MenuView
der Grenzen liegen), ButtonView
reagiert auf Berührungsereignisse. Wenn meine Berührungen außerhalb der MenuView
Grenzen liegen (aber immer noch innerhalb ButtonView
der Grenzen), wird kein Berührungsereignis von empfangen ButtonView
.
Beispiel:
- (E) ist
EditView
das übergeordnete Element aller Ansichten - (M) ist
MenuView
eine Unteransicht von EditView - (B) ist
ButtonView
eine Unteransicht von MenuView
Diagramm:
+------------------------------+
|E |
| |
| |
| |
| |
|+-----+ |
||B | |
|+-----+ |
|+----------------------------+|
||M ||
|| ||
|+----------------------------+|
+------------------------------+
Da sich (B) außerhalb des Rahmens von (M) befindet, wird niemals ein Tippen in der Region (B) an (M) gesendet. Tatsächlich analysiert (M) in diesem Fall niemals die Berührung, und die Berührung wird an gesendet das nächste Objekt in der Hierarchie.
Ziel: Ich hitTest:withEvent:
verstehe , dass das Überschreiben dieses Problem lösen kann, aber ich verstehe nicht genau, wie. Sollte in meinem Fall hitTest:withEvent:
in EditView
(meine 'Master'-Übersicht) überschrieben werden? Oder sollte es in MenuView
der direkten Übersicht über die Schaltfläche, die keine Berührungen erhält , überschrieben werden ? Oder denke ich falsch darüber nach?
Wenn dies eine ausführliche Erklärung erfordert, wäre eine gute Online-Ressource hilfreich - mit Ausnahme der UIView-Dokumente von Apple, die es mir nicht klar gemacht haben.
Vielen Dank!
quelle
Ok, ich habe ein bisschen gegraben und getestet, so
hitTest:withEvent
funktioniert es - zumindest auf hohem Niveau. Stellen Sie sich dieses Szenario vor:Diagramm:
Da sich (B) außerhalb des Rahmens von (M) befindet, wird niemals ein Tippen in der Region (B) an (M) gesendet. Tatsächlich analysiert (M) in diesem Fall niemals die Berührung, und die Berührung wird an gesendet das nächste Objekt in der Hierarchie.
Wenn Sie jedoch
hitTest:withEvent:
in (M) implementieren , werden Abgriffe an einer beliebigen Stelle in der Anwendung an (M) gesendet (oder es weiß zumindest davon). In diesem Fall können Sie Code schreiben, um die Berührung zu verarbeiten, und das Objekt zurückgeben, das die Berührung erhalten soll.Genauer gesagt: Das Ziel von
hitTest:withEvent:
ist es, das Objekt zurückzugeben, das den Treffer erhalten soll. In (M) könnten Sie also Code wie folgt schreiben:Ich bin noch sehr neu in dieser Methode und diesem Problem. Wenn es also effizientere oder korrektere Möglichkeiten gibt, den Code zu schreiben, kommentieren Sie dies bitte.
Ich hoffe, das hilft allen anderen, die diese Frage später beantworten. :) :)
quelle
In Swift 5
quelle
Was ich tun würde, ist, dass sowohl ButtonView als auch MenuView auf derselben Ebene in der Ansichtshierarchie vorhanden sind, indem beide in einem Container platziert werden, dessen Rahmen vollständig zu beiden passt. Auf diese Weise wird der interaktive Bereich des abgeschnittenen Elements aufgrund der Grenzen seiner Übersicht nicht ignoriert.
quelle
Wenn Sie viele andere Unteransichten in Ihrer übergeordneten Ansicht haben, funktionieren wahrscheinlich die meisten anderen interaktiven Ansichten nicht, wenn Sie die oben genannten Lösungen verwenden. In diesem Fall können Sie Folgendes verwenden (In Swift 3.2):
quelle
Wenn jemand es braucht, ist hier die schnelle Alternative
quelle
Platzieren Sie die folgenden Codezeilen in Ihrer Ansichtshierarchie:
Zur besseren Verdeutlichung wurde in meinem Blog erklärt: "goaheadwithiphonetech" in Bezug auf "Benutzerdefinierte Beschriftung: Schaltfläche ist kein anklickbares Problem".
Ich hoffe das hilft dir ... !!!
quelle