2010-03-29 2 views
14

Я пытаюсь определить, был ли затронут UILabel и если что-то сделать. Дайте ..Как определить, была ли затронута 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]; 
. 
. 
.  

Затем я пишу обратный вызов.

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

Проблема сейчас, независимо от того, где я касаюсь Вид, открывается Url. Как определить, был ли затронут только мой ярлык?

+6

Почему бы вам просто не заменить ярлык кнопкой? – zonble

ответ

20

Если добавить ярлык к классу, вы можете сделать хит-тест на ваш взгляд, в случае с сенсорным:

- (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] ...]; 
    ... 
    } 
} 

Кроме того, не забудьте освободить URL вы выделить (в противном случае вы просачиваетесь).

+0

Да, что он сказал. Отличный ответ Кевин! – Jordan

+0

Это служило мне с жестами –

1

Вы также можете добавить невидимый (а не текст или изображение) UIButton в качестве подзадачи того же размера, что и ваша метка. Это имеет дополнительное преимущество: не захватывать другие типы касаний, например, касаться другой области экрана, которая случайно скользит на ваш ярлык, а затем поднимается. Он также может считаться более чистым кодом.

4

я думаю, что лучший способ для ручки, чтобы установить флаг для каждого UILabel части, а затем дать номер флага из кода,

label.userInteractionEnabled = YES; 


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

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

Вы можете сделать это без перекрывая touchesBegan. Используйте распознаватели жестов.

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

[label addGestureRecognizer:recognizer]; 

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

извините, не работает для меня ...(ничего не вызвало вообще) – cV2

+0

Это может быть вызвано множеством опций. Например, ваше прикосновение может быть отменено с слоя, который скрывает метку, на которую вы помещаете распознаватель жестов, или свойство userInteractionEnabled вашего представления может быть установлено в NO в некоторый момент времени, когда вы выполняете действие касания. Добавьте метку в качестве последнего объекта массива subviews вашего целевого представления и повторите попытку. – Eugene

+0

большое спасибо за ваш ответ, userInteractionEnabled был включен, я сделал небольшое обходное решение, которое позволило пользователю выполнить все необходимые действия. Спасибо! – cV2

4

Решение Eugene работает, но у вас должно быть включено «взаимодействие с пользователем» в вашем файле NIB. Или, как у Махьяра с меткой .userInteractionEnabled = YES.

Вот мое решение, поскольку у меня были две отдельные ярлыки, которые я хотел захватить. И у меня включено «взаимодействие с пользователем» в моем файле 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]; 

Надеюсь, это поможет.

0

Другой поздний ответ ...

Как @Kevin Sylvestre предполагает, что вы можете проверить на ощупь над UILabel переопределив -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event в контроллере представления.

Однако, вместо того, чтобы проверять, находится ли контакт с прямоугольником UILabel, мне легче проверить, было ли прикосновение к «представлению» UILabel (помните, что UILabel наследуется от UIView).

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesBegan:touches withEvent:event]; 

    NSSet *touchedViews = [touches valueForKeyPath:@"view"]; 
    if ([touchedViews containsObject:self.myLabel]) { 
     // do something 
    } 
} 

Этот метод может быть легко применен к другим объектам интерфейса, которые наследуются от UIView.

Также необходимо, чтобы UILabel имел возможность «взаимодействия с пользователем» реагировать на событие касания. Это можно сделать в интерфейсе Builder (Attributes Inspector> View> User Interaction Enabled) или программно - например: self.myLabel.userInteractionEnabled = YES;

Смежные вопросы