Как определить, была ли затронута 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. Как определить, был ли затронут только мой ярлык?
Ответы
Ответ 1
Если вы добавите ярлык в класс, вы можете сделать хитовую проверку на вашем экране в событии касания с помощью:
- (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-адрес, который вы выделяете (в противном случае вы протекаете).
Ответ 2
Вы можете сделать это без переопределения штрихов. Используйте распознаватели жестов.
UILabel *label = ...;
label.userInteractionEnabled = YES;
UITapGestureRecognizer *recognizer = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)] autorelease];
[label addGestureRecognizer:recognizer];
- (void)tapAction {
NSLog(@"tap performed");
}
Ответ 3
Я думаю, что лучший способ для дескриптора - установить флаг для каждой части uilabel, а затем указать номер флага из кода,
label.userInteractionEnabled = YES;
-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
UITouch *touch = [touches anyobject];
if(touch.view.tag == uurflagnumber)
NSlog(@"touched");
}
Ответ 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];
Надеюсь, это поможет.
Ответ 5
Вы также можете добавить невидимый (не текст или изображение) UIButton
в качестве подзадачи того же размера, что и ваш ярлык. Это имеет дополнительное преимущество: не захватывать другие типы касаний, например, касаться другой области экрана, которая случайно скользит на ваш ярлык, а затем поднимается. Он также может считаться более чистым кодом.
Ответ 6
Еще один поздний ответ...
Как и @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;