如何自定义UILabel可点击

时间:2011-01-20 04:32:56

标签: iphone uitableview uilabel

我想要的是什么:

在iPhone应用程序中,我想在tableView中显示信息。 在每个单元格中,文本如下:John最近听音乐abcdefg.mp3。 如果需要,文本可以有两行。

在文本中,a.mp3应该是可点击的,因此当用户触摸 abcdefg.mp3 部分时,将调用另一个页面。当用户触摸 abcdefg.mp3 时,它也会产生一些效果,就像触摸按钮一样。

我的所作所为:

我计算文本的框架,我使用UIButton作为 abcdefg.mp3

我的问题:

有时 abcdefg.mp3 可能是多行的,例如:

  

abc 位于第一行的末尾

     

defg.mp3 排在第二行。

在这种情况下我该怎么做?

我已经搜索过:Create tap-able "links" in the NSAttributedString of a UILabel? 但是我认为它不适合这里,因为可点击文本在样本中都在一行中。

7 个答案:

答案 0 :(得分:117)

最简单的方法是在实际视图中添加手势识别器(无论是UILabel还是自己的一些自定义视图)。为了使手势识别器工作,必须将视图设置为userInteractionEnabled。

这是一个例子,假设你的标签视图(或其他任何东西)被称为labelView:

UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userTappedOnLink:)];
// if labelView is not set userInteractionEnabled, you must do so
[labelView setUserInteractionEnabled:YES];
[labelView addGestureRecognizer:gesture];

在此示例中,操作消息将发送到self,消息将定义为

- (void)userTappedOnLink:(UIGestureRecognizer*)gestureRecognizer;

这与连接任何其他UIControl子类(例如按钮)相同。

其他注释:不要尝试将相同的手势识别器添加到多个视图中,它将无法正常工作。不要向多个视图添加多个手势识别器副本(它不会替换它们,只是将它们堆叠起来并浪费内存)。您应该在最初创建和配置视图时添加手势识别器。

有关详细信息,请参阅UIGestureRecognizer的文档。

答案 1 :(得分:8)

Swift 4.2版本:

var labelView = UILabel()
let gesture = UITapGestureRecognizer(target: self, action: #selector(userTappedOnLink))
// if labelView is not set userInteractionEnabled, you must do so
labelView.isUserInteractionEnabled = true
labelView.addGestureRecognizer(gesture)


@objc func userTappedOnLink() {
    print("clicked!")
}

答案 2 :(得分:2)

Swift 2.0版本:

  func userTappedOnLink() {
    print("clicked!")
  }

///tap and link to FB page
let gesture = UITapGestureRecognizer(target: self, action: "userTappedOnLink")
// if labelView is not set userInteractionEnabled, you must do so
lblStaff.userInteractionEnabled = true
lblStaff.addGestureRecognizer(gesture)

答案 3 :(得分:1)

听起来与他们在Fancy UILabels的Twitteriffic中所取得的相似。基本上,Craig Hockenberry制作了自己的自定义“数据检测器”,这样他就可以在标签和多行文本中插入链接。请参阅此问题:Is there a way to create custom UIDataDetectorTypes?

答案 4 :(得分:1)

你也可以在上面放一个“隐形按钮”,使用一个没有文字和图像的自定义按钮。

enter image description here

答案 5 :(得分:0)

我认为你可以使用textView和diable滚动。我为我的项目做了同样的事情,我需要指向网站地址。只需取消选中所有内容,如检查器窗口中“滚动视图”部分中的屏幕截图所示。 disable scrolling

答案 6 :(得分:0)

UITapGestureRecognizer添加到标签,以使UIlabel可点击。

在将标签添加到tapgesture之前,不要忘记为UIlabel启用用户交互

以下是示例代码:

//Tap Gesture
UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userTapped:)];
//Adding userinteraction for label
[labelName setUserInteractionEnabled:YES];
//Adding label to tap gesture
[labelName addGestureRecognizer:gesture];