我正在尝试确定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];
}
现在的问题是,无论我在视图中触摸的位置是打开的。如何确定是否仅触摸了我的标签?
答案 0 :(得分: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(否则您将泄露)。
答案 1 :(得分: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");
}
答案 2 :(得分:4)
我认为最好的处理方法是为每个uilabel部分设置标志,然后从代码中给出标志号,
label.userInteractionEnabled = YES;
-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
UITouch *touch = [touches anyobject];
if(touch.view.tag == uurflagnumber)
NSlog(@"touched");
}
答案 3 :(得分:4)
Eugene的解决方案有效,但您必须在NIB文件中勾选“启用用户交互”。或者Mahyar使用label.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];
我希望这会有所帮助。
答案 4 :(得分:1)
您还可以添加不可见(不是文字或图片)UIButton
作为与标签尺寸相同的子视图。这样做的另一个好处是不会捕捉其他类型的触摸,例如触摸屏幕上另一个意外滑入标签然后抬起的区域。它也可以被认为是更清晰的代码。
答案 5 :(得分:0)
另一个迟到的答案......
与@Kevin Sylvestre
建议一样,您可以通过覆盖视图控制器中的-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
来测试UILabel上的触摸。
然而,我没有测试触摸是否位于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还必须启用用户交互'对触摸事件做出反应。这可以在Interface Builder(Attributes Inspector> View> User Interaction Enabled)中或以编程方式完成 - 例如:self.myLabel.userInteractionEnabled = YES;