2010-02-08 2 views
6

Ich habe den folgenden Code, um festzustellen, ob eine Berührung innerhalb einer Bildansicht in meiner Tabellenzelle ist. Es funktioniert jedoch nicht. Ich habe die beiden mit CGRectContainsPoint verglichen, aber es funktioniert nicht. Hier ist der Code:Vergleichen einer UITouch-Position mit UIImageView-Rechteck

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  
{ 
    // Declare the touch and get it's location 

    UITouch *touch = [touches anyObject]; 

    CGPoint touchLocation = [touch locationInView:self]; 

    if (CGRectContainsPoint(myImageView.frame, touchLocation)) 
    { 
     NSLog(@"Tapped image view"); 
    }  
} 

Danke für die Hilfe!

Antwort

26

Es funktioniert jedoch nicht.

Bitte seien Sie genauer.

UITouch *touch = [touches anyObject]; 

Warum untersucht nicht jeden berühren, und nicht nur ein zufälliger * Pick von ihnen?

* The documentation for anyObject sagt, dass Sie nicht garantiert werden, welche es Ihnen geben wird. Sie sind nicht einmal garantiert, dass es zufällig sein wird; Es könnte jedes Mal dasselbe Objekt sein. Murphys Gesetz besagt, dass es, egal ob es zufällig ist oder nicht, falsch sein wird.

CGPoint touchLocation = [touch locationInView:self]; 
if (CGRectContainsPoint(myImageView.frame, touchLocation)) 

Ihre frame in Ihrem Superview ist Systems zu koordinieren; [touch locationInView:self] gibt den Berührungspunkt in Ihr Koordinatensystem zurück. Sie möchten innerhalb von bounds testen, was in Ihrem Koordinatensystem ist. The documentation explains the difference.

+0

Erweiterung: 'CGPoint touchLocation = [touch locationInView: self]; if (CGRectContainsPoint (myImageView.frame, touchLocation)) '' funktioniert nur, wenn 'myImageView' eine direkte Unteransicht von' self' –

+1

ist, die Joaos Kommentar erweitert. Sie können den Frame einer Unteransicht relativ zur Superview (oder einer beliebigen Ansicht) mit 'CGRect aufrufen frameRelativeToView = [myImageView convertRect: myImageView.bounds toView: self] ' – chazzwozzer

1

Das Problem ist, dass Sie [touch locationInView: myImageView] aufrufen müssen, um den Punkt im Koordinatensystem der Bildansichten zu erhalten. Dann überprüfen Sie, ob es innerhalb des Rahmens ist.

0

Denken Sie daran, dass wenn Sie eine Berührung für locationInView: fragen, Sie einen Punkt relativ zum Rahmen dieser Ansicht erhalten. Also, Schnipsel, den Code unter der Annahme, gab man in einer Unterklasse von UIViewController enthalten war, sollten Sie sich für

CGPoint touchLocation = [touch locationInView:self.view]; 

fragen, die Ihnen einen Punkt im Verhältnis zu Ihrer Ansicht geben. Der Grund, warum Sie einen Punkt relativ zu Ihrer aktuellen Ansicht haben möchten, liegt darin, dass der Rahmen Ihrer Bildansicht ebenfalls relativ zur übergeordneten Ansicht ist - die gleiche Ansicht. So, jetzt sollte es funktionieren.

if (CGRectContainsPoint(myImageView.frame, touchLocation)) { 
    NSLog(@"Tapped image view"); 
} 
1
UITouch *touch = [[event allTouches] anyObject]; 
CGPoint location = [touch locationInView:self]; 
if ([touch view]==view) { 
view.center=location; 
} 

schreiben sie in der Berührung bewegt Ereignis. Danke