Wie eine Folge von UITouch Ereignisse kündigen?

stimmen
20

Ich habe eine UIImageAnsicht , die Ereignisse zu berühren reagiert. Ich möchte die Touch - Sequenz abzubrechen, dh weitere Anrufe zu touchesMoved:, wenn die Berührung außerhalb bestimmter Grenzen geht. Wie kann ich das machen?

Ich weiß , dass in touchesMoved:mir die Koordinaten des Berührungs Objekts inspizieren kann und ignoriert es, aber was ich nicht weiß , ist , wie die Sequenz ganz abzubrechen. Ich sehe keine Methode in der Dokumentation Apple Developer UIResponderReference , die ich anrufen kann eine Touch - Sequenz abzubrechen.

Veröffentlicht am 10/02/2009 um 19:37
quelle vom benutzer
In anderen Sprachen...                            


12 antworten

stimmen
6

Diese Lösung kann ein bisschen kludgy sein, aber man konnte implementieren und manuell aufrufen

- (void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

Ich bin stützen diese Lösung lose auf einigen Optimierungen ich auf Apples zum MoveMe Beispiel - App haben iPhone - Beispielcode Ort , an dem ich die modifizierte touchesMovedMethode wie folgt aussehen:

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
     UITouch *touch = [touches anyObject];
     if ([touch view] == placardView)
         CGPoint location = [touch locationInView:self];
         placardView.center = location;
         // I added the following line:
         [self touchesCancelled:touches withEvent:event];
         return;
}
Beantwortet am 10/02/2009 um 20:51
quelle vom benutzer

stimmen
3

Versuchen Sie vorübergehend die UIImageView der userInteractionEnabled Eigenschaft auf NO setzen

Beantwortet am 28/11/2011 um 04:30
quelle vom benutzer

stimmen
3

Sie müssen rufen , [super touchesMoved:withEvent:]um die super Aussicht von der Veranstaltung aufzuräumen zu lassen , aber was noch wichtiger ist , müssen Sie nicht nennen [super touchesCancelled:withEvent:].

Hier ist, was ich auf einer Zelle verwendet, damit er nicht ausgewählt wurden, wenn ich einen Schlag festgestellt:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (!showingEdit) {
        if (IS_FAR_ENOUGH_TO_BE_A_SWIPE) {
            RESPOND_TO_SWIPE
            showingEdit = YES;
            [super touchesCancelled:touches withEvent:event];
        } else {
            [super touchesMoved:touches withEvent:event];
        }
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (!showingEdit) {
        [super touchesEnded:touches withEvent:event];
    }
}
Beantwortet am 13/05/2010 um 01:50
quelle vom benutzer

stimmen
2

Ich glaube nicht, es ist möglich, weil ich sehe nicht, es dokumentiert und keine dieser Lösungen arbeiten.

Beantwortet am 21/11/2011 um 05:23
quelle vom benutzer

stimmen
2

Ich habe das gleiche Problem vor kurzem konfrontiert und fand einen Standard-Weg, es zu lösen. Sie können [[UIApplication shared] beginIgnoringInteractionEvents] touchesMoved Ereignisse auf Ihre gesamte App liefern zu stoppen. Stellen Sie sicher, damit sie mit den [[UIApplication shared] endIgnoringInteractionEvents], wenn Sie berührt müssen erhalten wieder.

Beantwortet am 05/04/2010 um 10:30
quelle vom benutzer

stimmen
1

Dies erreiche ich durch den Blick von seiner Superview entfernt und direkt wieder hinzufügen.

[view retain];
UIView *sv = view.superview;
[view removeFromSuperview];
[sv addSubview:view];
[view release];

Dies bricht die Responder-Kette zu der Ansicht, so dass alle verbleibenden berührt werden nicht auf der Ansicht, empfangen werden. Die nächste Note wird immer noch als normal empfangen werden.

Beantwortet am 03/08/2016 um 10:44
quelle vom benutzer

stimmen
1

Dieser Code wird Ihnen helfen. Ich deaktivieren Berührungsereignis in touchesMoved:Methode und ich bin damit Berührungsereignis in touchesCancelled:Verfahren

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
     UITouch *touch = [touches anyObject];
     .......
     .......
     Your code
     .......
     .......

     //Condition when you want to disable touch event

     [[UIApplication sharedApplication] beginIgnoringInteractionEvents];

     .......
     .......
     Your code
     .......
     .......
 }


- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    [[UIApplication sharedApplication] endIgnoringInteractionEvents];
}
Beantwortet am 21/08/2014 um 11:31
quelle vom benutzer

stimmen
1

„Brute-Force“ Lösung je nachdem, ob es Ihren Bedürfnissen entspricht: Entfernen und neu initialisieren die Subview, die berührt oder reagiert auf sie empfängt (natürlich von Rahmen und Inhalt kümmern).

Beantwortet am 24/03/2013 um 21:56
quelle vom benutzer

stimmen
0

Ich habe nur versucht, etwas zu lösen, und fanden heraus, dass keine der aufgelisteten Lösungen sie für mich gearbeitet. Das Beste, was ich gelang ignoriert vorübergehend die Berührungen, aber dann setzten sie bei der Berührung der Ansicht neu eingegeben.

Schließlich löste es.

  1. Richten Sie einen boolean-Flag namens „disabled“
  2. In touchedMoved, prüft zuerst, dass die Berührung innerhalb der gewünschten Ansicht ist. Wenn dies nicht der Fall, stellen Sie den Behinderten-Flag auf JA.
  3. Noch in in touchedMoved, überprüfen Sie die Flagge vor Ihrer Aktion ausführen. Also, an diesem Punkt nichts passieren wird, wenn sie außerhalb der Ansicht ist.
  4. In touchesEnded stellen die deaktivierte Flag auf NO. So ist die Touch-Sequenz wirksam gestoppt, bis der Benutzer seinen Finger hebt.

Ich denke, das wird für Sie arbeitet, wenn Sie einen besonderen Grund für wahrsten Sinn des Wort der Touch-Sequenz abgebrochen müssen.

Beantwortet am 13/01/2013 um 15:41
quelle vom benutzer

stimmen
0

Auf iOS5 scheint es eine private Methode in UITouch zu sein

-(void)setSentTouchesEnded:(BOOL)ended;

Je nach Apfel-Implementierung könnte es stoppen Senden von Ereignissen

Ein anderer Weg, dies zu tun, wäre mit assoziativen Objekten

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    if ([(NSNumber *)objc_getAssociatedObject(touch, &outKey) boolValue])
        return;
    if (sometouchisoutsideofview) {
        objc_setAssociatedObject(touch, &outKey, [NSNumber numberWithBool:YES], OBJC_ASSOCIATION_RETAIN);
    }
}
Beantwortet am 25/11/2011 um 19:44
quelle vom benutzer

stimmen
-1

Sie können Kategorie UITouch erstellen. Sie können erklären

@property (nonatomic,strong,readwrite) UIView *view;

Und wenn Sie touch.view auf Null, zum Beispiel ändern, können Sie Ende des Versands von Touch-Ereignisse simulieren

Beantwortet am 17/04/2013 um 20:43
quelle vom benutzer

stimmen
-2

Sie können das überprüfen, die Berührungspunktpositionen in sind CGRect (dh. Punkte sind in Rectangle Ihrer Imageview) oder nicht. Wenn sie nicht in diesem Rect sind, wird die Note abgebrochen.

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
 {
UITouch *touch = [touches anyObject];
CGPoint touchLocation = [touch locationInView:self.view];

    if (CGRectContainsPoint(myImageView, touchLocation))
    {
       lastPoint = [touch locationInView: myImageView];
    }

    NSLog(@"Last :%.2f - %.2f",lastPoint.x, lastPoint.y);   
  }

 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
 {
  CGPoint currentPoint;
  UITouch *touch = [touches anyObject];
  CGPoint touchLocation = [touch locationInView:self.view];

     if (CGRectContainsPoint(myImageView.frame, touchLocation))
     {
       currentPoint = [touch locationInView: myImageView];
     }
 }
Beantwortet am 24/11/2011 um 06:44
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more