11 Stimmen

UIView, wie man feststellt, wann Berührungen die Ansicht betreten haben

Es scheint, dass alle Berührungsmethoden einer UIView nur aufgerufen werden, wenn die Berührungen innerhalb der Grenzen dieser Ansicht beginnen. Gibt es eine Möglichkeit, eine Ansicht auf einen Benutzer reagieren zu lassen, der außerhalb der Ansicht berührt hat, dann aber seine Finger in die Ansicht gezogen hat?

Für den Fall, dass es wichtig ist, ist meine spezifische Anwendung für das Ziehen eines MKPinAnnotationView (mit eingebauten 4.0 Ziehen). Ich möchte, dass etwas passiert, wenn der Benutzer einen Pin auf eine andere Ansicht zieht (die zufällig auch eine AnnotationView ist, aber es könnte alles sein). Keine Methode für das Ziehen wird aufgerufen, bis ich den Stift loslassen; und keine Methode keine die UIView, die gezogen wird, scheint aufgerufen werden, es sei denn, ich durch Berühren aus der Ansicht gestartet.

Da es sich bei der Superview um eine MKMapView handelt, ist es schwierig, einfach das touchesMoved-Ereignis zu verwenden und zu prüfen, ob sich der Benutzer an der richtigen Stelle befindet oder nicht. Danke!

3voto

GendoIkari Punkte 11474

Nachdem ich also eine Weile damit herumgespielt hatte, fand ich heraus, dass die gegebene Antwort ici gab mir tatsächlich das, was ich brauchte, obwohl die Frage, die gestellt wurde, eine andere war.

Es hat sich herausgestellt, dass man die Unterklasse UIGestureRecognizer; verwenden kann, um alle Berührungen für die Ansicht zu behandeln, der sie hinzugefügt wurde (einschließlich einer MKMapView). Dies ermöglicht alle normalen MKMapView Interaktionen immer noch ohne Probleme zu verhalten; aber auch benachrichtigt mich der Berührungen. In touchesMoved, überprüfe ich einfach die Position der Berührung; und sehen, wenn es innerhalb der Grenzen meiner anderen Ansicht ist.

Nach allem, was ich ausprobiert habe, scheint dies die einzige Möglichkeit zu sein, touchesMoved abzufangen, während der Benutzer eine MKAnnotation zieht.

1voto

v01d Punkte 1566

Natürlich können Sie das:

(HitstateView.h)

#import <UIKit/UIKit.h>

@interface HitstateView : UIView {
    id overrideObject;
}

@property (nonatomic, retain) id overrideObject;

@end

(HitstateView.m)

#import "HitstateView.h"

@implementation HitstateView

@synthesize overrideObject;

- (void)dealloc {
    self.overrideObject = nil;

    [super dealloc];
}

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView *hitView = [super hitTest:point withEvent:event];
    if (hitView == self) {
        return overrideObject;
    }
    return hitView;
}

@end

Machen Sie diese Ansicht so groß wie Ihren Touchbereich. Setzen Sie das overideObject auf die Ansicht, in die Sie die Berührungen legen wollen. IIRC sollte es eine Unteransicht der HitstateView sein.

0voto

Adam Eberbach Punkte 12257

Jede Ansicht erbt UIResponder Ich glaube nicht, dass das Starten der Berührung außerhalb der Ansicht bedeutet, dass die Ansicht kein Ereignis erhält, wenn sich die Berührung über die Ansicht bewegt. Wenn Sie eine Benachrichtigung erhalten wollen, dass etwas auf Ihren MKMapView gezogen wurde, sollten Sie eine Unterklasse erstellen, die die Berührung behandelt, aber dann das Ereignis an super Damit kann die Hierarchie mit der Berührung tun, was sie tun muss. Sie brauchen das Ereignis nicht zu erfassen oder zu ändern, sondern nur zu beobachten.

0voto

walter Punkte 344

Das hängt davon ab, wie Ihre Ansichten aufgebaut sind. Im Allgemeinen ist es am besten, die Responderkette zu nutzen. Sie können damit tricksen, auch wenn es für Ihre speziellen Bedürfnisse zu spezifisch ist.

Sie können auch mit Vorwärtsereignissen tricksen, indem Sie Hit-Tests außer Kraft setzen:

http://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MultitouchEvents/MultitouchEvents.html%23//apple_ref/doc/uid/TP40009541-CH3-SW3

Ihr spezieller Fall klingt ziemlich exotisch, so dass Sie möglicherweise Tricks anwenden müssen, wie z. B. eine übergeordnete Ansicht, deren Rahmen groß genug ist, um beide fraglichen Ansichten zu enthalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X