UILabel vs UITextView 和属性字符串 url 链接

Posted

技术标签:

【中文标题】UILabel vs UITextView 和属性字符串 url 链接【英文标题】:UILabel vs UITextView and attributed string url links 【发布时间】:2019-09-22 04:37:24 【问题描述】:

如果我使用下面的相同函数为带有 UILabel 和 UITextView 的属性字符串设置一些属性,那么两种情况下的显示看起来都是一样的,但我无法点击 UILabel 的链接(用户交互是已启用)。

为什么 UILabel 不响应点击而 UITextVIew 响应,如何使 UILabel 表现得像 UITextVIew?

我看到了一个过去的问题,答案是为 UILabel 设置 dataDetectors,但这一定是针对旧版本的 Swift,因为它不再存在,而且我没有看到任何类似的替代方案。

class MyViewController: UIViewController 

    @IBOutlet weak var label1: UILabel!
    @IBOutlet weak var textView1: UITextView!

    let kTextContent = "This is some text with bold and link1 and link2 and color."
    let kBoldText = "bold"
    let kLink1Text = "link1"
    let kLink2Text = "link2"
    let kColorText = "color"
    let kUrl1 = "http://www.google.com"
    let kUrl2 = "http://www.apple.com"

    override func viewDidLoad() 
        super.viewDidLoad()

        label1.text = kTextContent
        label1.attributedText = setAttributes(theAttributedString: label1.attributedText?.mutableCopy(with: nil) as! NSMutableAttributedString)

        textView1.text = kTextContent
        textView1.attributedText = setAttributes(theAttributedString: textView1.attributedText?.mutableCopy(with: nil) as! NSMutableAttributedString)
    

    func setAttributes(theAttributedString: NSMutableAttributedString) -> NSMutableAttributedString
    
        let boldRange = theAttributedString.mutableString.range(of: kBoldText)
        let boldFontAttribute: [NSAttributedString.Key: Any] = [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 20)]
        theAttributedString.addAttributes(boldFontAttribute, range: boldRange)

        let link1Range = theAttributedString.mutableString.range(of: kLink1Text)
        theAttributedString.addAttribute(.link, value: kUrl1, range: link1Range)
        theAttributedString.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: link1Range)

        let link2Range = theAttributedString.mutableString.range(of: kLink2Text)
        theAttributedString.addAttribute(NSAttributedString.Key.link, value: kUrl2, range: link2Range)
        theAttributedString.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: link2Range)

        let colorRange = theAttributedString.mutableString.range(of: kColorText)
        theAttributedString.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.red , range: colorRange)

        return theAttributedString
    

【问题讨论】:

***.com/questions/55826193/… 这是从 ios 开始的正常行为。请参阅我解释原因的链接相关答案,并且一定要查看 WWDC 视频。 【参考方案1】:

响应点击的UILabelUIButton,我建议您将UILabel 换成按钮并设置相应的样式。然后,您只需将IBAction 连接到它就可以了。

UITextView默认响应交互

【讨论】:

但是一个按钮在图形上看起来一点也不像 UILabel。你的意思是给按钮透明边框和背景等。 是的,这正是我的意思。您也可以将UITapGesture 添加到UILabel,但从技术上讲,您只是在重新创建UIButton 有两个不同的URL链接,如何将整个文本变成一个按钮? @user9435893 阅读我对相关问题的回答。我解释了为什么它不起作用,如何使它起作用,以及 Apple 的推荐。但你看到的是正常行为。

以上是关于UILabel vs UITextView 和属性字符串 url 链接的主要内容,如果未能解决你的问题,请参考以下文章

UITextView 和 UILabel 子视图属性为零

iOS中用UILabel实现UITextView的占位文字

使用故事板、自动布局和 Swift 的多行 UILabel 和 UITextView

在自动布局中隐藏 UITextView 和 UILabel

使用下一个和上一个 UIButton 在 UITextView/UILabel 中更改不同的文本

使用不可见的 UILabel 并触发 UITextView 事件或不使用 UILabel 并处理 UITextView 点击识别器