如何自定义UILabel可点击

sco*_*ozj 29 iphone uitableview uilabel

我想要的是:

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

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

我所做的:

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

我的问题:

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

abc位于第一行的末尾

defg.mp3在第二行.

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

我已经搜索过了:在UILabel的NSAttributedString中创建可点击的"链接"? 但是我认为它不适合这里,因为可点击文本全部在示例中的一行中.

Jas*_*oco 118

最简单的方法是在实际视图中添加手势识别器(无论是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];
Run Code Online (Sandbox Code Playgroud)

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

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

这与连接任何其他UIControl子类(例如按钮)的工作方式相同.

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

有关更多信息,请参阅UIGestureRecognizer的文档.


Esq*_*uth 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!")
}
Run Code Online (Sandbox Code Playgroud)