2010-02-08 13 views
6

Mam następujący kod, aby określić, czy dotyk znajduje się w widoku obrazu w mojej komórce tabeli. Jednak to nie działa. Porównałem te dwa z CGRectContainsPoint, ale to nie działa. Oto kod:Porównywanie położenia UITouch z prostokątem UIImageView

-(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"); 
    }  
} 

Dzięki za pomoc!

Odpowiedz

26

Jednak to nie działa.

Proszę podać dokładniejsze informacje.

UITouch *touch = [touches anyObject]; 

Dlaczego nie badać każdy dotyku, a nie po prostu przypadkowy * transfer z nich?

* The documentation for anyObject mówi, że nie masz gwarancji, która z nich ci da. Nie masz nawet gwarancji, że będzie losowy; to może być ten sam obiekt za każdym razem. Prawo Murphy'ego mówi, że bez względu na to, czy jest przypadkowe czy nie, będzie to niewłaściwe.

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

Twój frame jest w układzie współrzędnych swojej Superview za; [touch locationInView:self] zwraca punkt dotykowy w swoim systemie współrzędnych. Chcesz przetestować w ramach bounds, który znajduje się w twoim układzie współrzędnych. The documentation explains the difference.

+0

rozwijanie: 'CGPoint touchLocation = [touch locationInView: self]; if (CGRectContainsPoint (myImageView.frame, touchLocation)) 'działa tylko wtedy, gdy' myImageView' jest bezpośrednim podglądem 'self' –

+1

rozwijającym się na komentarz Joao, możesz uzyskać ramkę subview w stosunku do superview (lub dowolnego widoku) za pomocą' CGRect frameRelativeToView = [myImageView convertRect: myImageView.bounds toView: self] ' – chazzwozzer

1

Problem polega na tym, że należy wywołać [touch locationInView: myImageView], aby uzyskać punkt w układzie współrzędnych obrazu. Następnie sprawdź, czy znajduje się w ramce.

0

Pamiętaj, że gdy pytasz o dotknięcie dla lokalizacjiInView :, uzyskujesz punkt względem ramki tego widoku. Tak więc, zakładając Fragment kodu daliście została zawarta w podklasie UIViewController powinno być pytanie o

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

która daje punkt względem widoku. Powodem, dla którego chcesz mieć punkt względem bieżącego widoku, jest to, że ramka widoku obrazu jest również względna w stosunku do widoku nadrzędnego - ten sam widok. Teraz powinno działać.

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; 
} 

napisać to w przypadku dotykowym przeniesiony. thanx

Powiązane problemy