2013-05-02 4 views
17

Ich möchte einen UIImage auf einen von mehreren UIButtons ziehen und ihn basierend darauf verschieben, auf welchen Knopf ich ihn ziehe.Wie finde ich heraus, in welcher Ansicht ein Touch-Event endete?

Das Problem, mit dem ich gelaufen bin, ist, dass UITouch nur die Ansicht aufzeichnet, wo meine Berührung anfing, möchte ich auf die Ansicht zugreifen, die meine Berührung endet. Wie kann ich das machen?

Code:

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

    dealerBtnOrigin = [touch locationInView:self.view]; 

    //NSLog(@"%u %u",touch.view.tag, ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]).tag); 
    //CHECK TO SEE WHICH BUTTON WAS TOUCHED 
    if (touch.view == ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]])) 
    { 
     ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]).center = location; 
    } 
} 

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


    if (touch.view == ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]])) 
    { 
     ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]).center = location; 
    } 
} 

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInView:self.view]; 
    UIView *endView = [self.view hitTest:location withEvent:nil]; 

    if (touch.view == ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]])) 
    { 
     NSLog(@"%u %u",endView.tag, touch.view.tag); 
     if([buttons containsObject:(UIButton *)endView]) 
     { 
      [[dealerBtns objectAtIndex:[table getButtonSeat]] setHidden:YES]; 
      [table passButton:touch.view.tag]; 
      [[dealerBtns objectAtIndex: touch.view.tag] setHidden:NO]; 
     } 
     ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]).center = dealerBtnOrigin; 
    } 

} 
+0

Ich glaube nicht, dass ich mit einer manuellen Lösung mit CGPoint-Koordinaten gehen kann, um herauszufinden, welche Taste ich verwende, da ich mehrere Storyboards für verschiedene Bildschirmgrößen/Geräte verwende. – Deco

Antwort

16

Es ist sehr einfach, Ihren schließlich berühren Blick zu erkennen, versuchen Sie diesen Code

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    CGPoint location = [[touches anyObject] locationInView:self.view]; 
    CGRect fingerRect = CGRectMake(location.x-5, location.y-5, 10, 10); 

    for(UIView *view in self.view.subviews){ 
     CGRect subviewFrame = view.frame; 

     if(CGRectIntersectsRect(fingerRect, subviewFrame)){ 
      //we found the finally touched view 
      NSLog(@"Yeah !, i found it %@",view); 
     } 

    } 

} 
+0

Dies ergab drei Ansichten: * Meine Apps Hintergrundbild * Die UIButton ich durch kleine UIImage (der Ansicht ich will) geschleppt * Meine kleine UIImage Interessant zu sehen, wie das funktioniert und erklärt wahrscheinlich, warum die Antwort über didn‘ t Arbeit für mich. Vielen Dank. – Deco

+0

Sehr sehr sehr schöne Lösung, hoffe das Beste für Sie :) – TMMDev

+1

Sie können CGRectContainsPoint anstelle von CGRectInterectscectsRect für eine genauere Schnittmenge verwenden. –

0

In der Regel müssen Sie den Punkt bringen, wo die Berührung beendet, und bestimmen, ob es in der Ansicht liegt, an der Sie interessiert sind. Ich tue dies mit einem Code ähnlich dem folgenden:

(Dieser Code wurde im laufenden Betrieb bearbeitet, um viele irrelevante Dinge zu entfernen, aber ich habe eine Liste mit möglichen Drop - Zielen in dropTargets, und diese Liste wird nur angezeigt, um zu sehen, welche der möglichen UIViews das enthält Punkt).

Wenn Sie die Ansicht oder die Ansichten kennen, in die Sie das Element möglicherweise ziehen, ist es wichtig, dass Sie feststellen können, ob der Rahmen dieser Ansicht den Punkt enthält, in dem CGRectContainsPoint verwendet wird. Es ist wichtig zu beachten, dass sie in verschiedenen Koordinatensystemen liegen können und dass es notwendig sein kann, vor dem Vergleich von einem zum anderen zu konvertieren.

21

Verwenden Sie den Hit-Test. Sie kennen die Position dieses Punktes als CGPoint in Bezug auf die ultimative Superansicht, self.view. Dann können Sie self.view stellen, die seiner Subviews dieser Punkt in ist:

CGPoint location = [touch locationInView:self.view]; 
UIView* v = [self.view hitTest:location withEvent:nil]; 

Die UIView v ist die Ansicht, die Sie suchen.

+0

Ich habe dies in meinen Code (in TouchesEnded) geworfen und ich bekomme immer noch die Ansicht, die Berührung begann bei. Ich habe meine Frage aktualisiert, um einen Hittest zu enthalten. – Deco

+0

Nach ein wenig experimentieren sieht es so aus, als ob die zurückgegebene Ansicht tatsächlich die UIImage ist, die ich ziehe, anstatt die ursprüngliche UIButton (sie haben das gleiche Tag) oder die Schaltfläche, die ich das Bild wie beabsichtigt ziehen. – Deco

+1

Ja, ich hatte Angst, dass das passieren könnte. Okay, dann ist die einfache Lösung * override * 'hitTest: withEvent:' in 'self.view', so dass, wenn du diesen * bestimmten * hit-test ausführst, er nicht die Ansicht zurückgibt, die du ziehst (du Ich muss ihm sagen, was das ist). Es wird dann weiter Hit-Tests durchführen und stattdessen die Ansicht hinter diesem zurückgeben. – matt

0

Angenommen, es ist ein @property der Zielansicht in Ihrem Container, und die Zielansicht wird in den Behälter gegeben:

@property (nonatomic, strong) UIView* targetView; 

// ... 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSSet* touchesForTargetView = [event touchesForView:self.targetView]; 
    if (touchesForTargetView.allObjects.count != 0) { 
     // touch was at target view 
    } 
    else { 
     // touch was somewhere else 
    }  
} 
0

swift 4:

Überschreibung func touchesEnded (_ berührt: Set, mit Ereignis: UIEvent) {

if let touch = touches.first{ 
     let location = touch.location(in: self.view) 
     let v = touch.view 

// weitergehen .. }

}