iOS - 如何在Swift中使UILabel中的链接可被点击

6

这是显示链接在UILabel中的代码

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var textFiled: UITextField!

    @IBOutlet weak var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let attrStr = try! NSAttributedString(
            data: "This is a link <a href='http://www.google.com'>google</a>".dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true)!,
            options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
            documentAttributes: nil)
        label.attributedText = attrStr
    }

}

enter image description here

正如您从图片中看到的那样,它正确地显示了我想要的链接,但是无法点击跳转到网页视图或其他。实际上,我需要自定义链接点击事件,但我真的不知道该怎么做:
  1. 如何获取链接的URL。
  2. 如果有多个链接,我需要做什么。
感谢您首先查看这个问题。
5个回答

1
短答案是UILabel不支持打开URL。它可以检测到链接的存在,但不会执行任何操作。您可以寻找解决问题的替代方案,可以在这里阅读相关信息。

1

1
这是一个简单的方法,适用于您的需求,我曾经使用它来创建可点击的标签。
private let linkLabel: UILabel = {
    let label = UILabel()
    label.text = "Link"
    return label
}()

  func setup() {
        linkLabel.isUserInteractionEnabled = true
        let tap = UITapGestureRecognizer(target: self, action: #selector(openLink))
        linkLabel.addGestureRecognizer(tap)
}

    if let openLink = URL(string: "http://www.apple.com") {
    if UIApplication.shared.canOpenURL(url) {
        UIApplication.shared.open(url, options: [:])
    }
}

0

对于链接,通常正确的答案是使用UITextView

但我知道,对于简单的用例来说,额外的两个子视图可能会有点沉重。 UILabel的子类很好,但这样你就无法使用自己的子类了。其他答案都依赖于重新创建自己的文本堆栈,希望能够“模仿”UILabel使用的那个,但当文本开始缩小时,这种方法很快就失败了。

因为这些原因,我创建了LinkGestureRecognizerhttps://github.com/stuartjmoore/UILabel-LinkGestureRecognizer)以满足您所有UILabel的需求。

它就像这样简单:

let label = UILabel()
label.attributedText = // An attributed string with inline link ranges

let linkGestureRecognizer = LinkGestureRecognizer(target: self, action: #selector(handleLinkTap))
label.addGestureRecognizer(linkGestureRecognizer)

@objc func handleLinkTap(_ gestureRecognizer: LinkGestureRecognizer) {
    // handle gestureRecognizer.url in gestureRecognizer.range (UTF-16)
}

0
如Luke所说,UILabel不支持URL。但是你可以创建一个看起来像标签的按钮。去掉背景色(使其看起来像文本),并将功能实现到按钮上以打开webview。你可以使用属性字符串来编辑按钮中文本的样式。
当您将按钮添加到UI中时,要使用自定义类而不是默认的uibutton类。
你需要:
  1. 初始化

    - (instancetype)initWithFrame:(CGRect)frame {
       self = [super initWithFrame:frame];
         if (self)
         {
             //调用方法配置按钮
             [self configure];
         }
       return self;
     }
    
  2. 如果您使用的是属性字符串,请实现setTitle或setAttributedTitle

    - (void) setTitle:(NSString *)title forState:(UIControlState)state
     {
            [super setTitle:title forState:state]
     }      
    

或者

      - (void)setAttributedTitle:(NSAttributedString *)title forState:   (UIControlState)state{
            [super setAttributedTitle:title forState:state];
         }

3. 配置按钮

         -(void) configure{
             //configure the buttons label here 
             //you will want to set no background colour
          }

4. 将按钮添加到视图控制器中,并将类更改为您创建的自定义类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接