2010-03-29 16 views
14

Próbuję ustalić, czy dotknięto UILabel, a jeśli tak, to zrób coś. Podaj ..Jak ustalić, czy dotknięto UILabel?

. 
. 
. 
UILabel * site = [[UILabel alloc] initWithFrame:CGRectMake(0, 185, 320, 30)]; 
site.text = [retriever.plistDict valueForKey:@"url"]; 
site.textAlignment =UITextAlignmentCenter; 
site.backgroundColor = [UIColor clearColor]; 
site.textColor = [UIColor whiteColor]; 
site.userInteractionEnabled = YES; 
[theBgView addSubview:site]; 
[site release]; 
. 
. 
.  

Następnie piszę wywołanie zwrotne.

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
    retriever = [PListRetriever sharedInstance]; 
    CGPoint pt = [[touches anyObject] locationInView: self]; 
     NSURL *target = [[NSURL alloc] initWithString:[retriever.plistDict valueForKey:@"url"]]; 
     [[UIApplication sharedApplication] openURL:target]; 
    } 

Problem jest teraz, bez względu na to, gdzie dotknę w widoku Wyświetl adres URL jest otwarty. Jak mogę ustalić, czy tylko moja etykieta została dotknięta?

+6

Dlaczego po prostu nie zastąpisz swojej etykiety przyciskiem? – zonble

Odpowiedz

20

Jeśli dodać etykietę do klasy, można zrobić hit test na widoku w dotyku zdarzenia z:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [[event allTouches] anyObject]; 
    if (CGRectContainsPoint([self.site frame], [touch locationInView:self.view])) 
    { 
    NSURL *target = [[NSURL alloc] ...]; 
    ... 
    } 
} 

Ponadto, nie zapomnij, aby zwolnić URL można przydzielić (inaczej jesteś przecieka).

+0

Tak, to co powiedział. Doskonała odpowiedź Kevin! – Jordan

+0

To mi się przydało z gestami –

1

Można również dodać niewidoczne (nie tekstowe lub graficzne) UIButton jako wyrób o tym samym rozmiarze co etykieta. Ma to tę dodatkową zaletę, że nie przechwytuje innych rodzajów dotknięć, takich jak dotyk w innym obszarze ekranu, który przypadkowo wślizguje się na etykietę, a następnie podnosi się. Można go również uznać za czystszy kod.

4

Myślę, że najlepszym sposobem na uchwyt jest ustawienie flagi dla każdej części UILabel a następnie podać numer flagi z kodem,

label.userInteractionEnabled = YES; 


-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { 
    UITouch *touch = [touches anyobject]; 

    if(touch.view.tag == uurflagnumber) 
    NSlog(@"touched"); 
} 
19

Można to zrobić bez przesłanianie touchesBegan. Użyj rozpoznawania gestów.

UILabel *label = ...; 
label.userInteractionEnabled = YES; 
UITapGestureRecognizer *recognizer = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)] autorelease]; 

[label addGestureRecognizer:recognizer]; 

- (void)tapAction { 
    NSLog(@"tap performed"); 
} 
+0

Przepraszam, nie działa dla mnie ...(nic się nie uruchamia) – cV2

+0

Może to być spowodowane różnymi opcjami. Na przykład Twój dotyk może zostać anulowany z warstwy, która zasłania etykietę, na którą umieszczasz narzędzie do rozpoznawania gestów, lub właściwość userInteractionEnabled twojego widoku może być ustawiona na NIE w pewnym momencie, kiedy wykonujesz czynność stuknięcia. Dodaj etykietę jako ostatni obiekt macierzy subviews widoku docelowego i spróbuj ponownie. – Eugene

+0

bardzo dziękuję za odpowiedź, userInteractionEnabled został ustawiony na włączony, zrobiłem małe obejście, które pozwoliło użytkownikowi na wykonanie wszystkich potrzebnych działań. Dziękuję Ci! – cV2

4

Rozwiązanie Eugene działa, ale musisz zaznaczyć opcję "interakcja z użytkownikiem" w pliku NIB. Lub jak Mahyar ma z label.userInteractionEnabled = YES.

Oto moje rozwiązanie, ponieważ miałem dwie oddzielne etykiety, które chciałem uchwycić. I mam "włączoną interakcję użytkownika" zaznaczoną w moim pliku nib.

UITapGestureRecognizer *theSpeedTapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)]; 
[speedLabel addGestureRecognizer:theSpeedTapped]; 

UITapGestureRecognizer *theDirectionTapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)]; 
[directionLabel addGestureRecognizer:theDirectionTapped]; 

Mam nadzieję, że to pomoże.

0

Innym późno odpowiedź ...

Jak @Kevin Sylvestre sugeruje, można przetestować za dotknięciem nad UILabel nadrzędnymi -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event w kontrolerze widoku.

Jednak zamiast testowania czy dotykowy znajduje się z rect z UILabel, to łatwiej sprawdzić, czy dotyk był na „widoku” z UILabel (pamiętaj UILabel dziedziczy z UIView).

Ta technika może być łatwo zastosowana do innych obiektów interfejsu dziedziczących z UIView.

Ponadto UILabel musi mieć włączoną opcję "interakcji użytkownika", aby zareagować na wydarzenie dotykowe. Można to zrobić za pomocą Kreatora interfejsów (Inspektor atrybutu> Widok> Włączona interakcja użytkownika) lub programowo - na przykład: self.myLabel.userInteractionEnabled = YES;

Powiązane problemy