如何在Swift 3中的UILabel中创建可点击的主题标签?

时间:2017-01-10 23:38:40

标签: ios swift swift3 uilabel

在我的应用程序中,我创建了一个包含以下方法的UILabel扩展:

func formatTextInLabel() {
    let text = self.text
    let font = UIFont(name: fontName, size: 16.0)
    let titleDict: NSDictionary = [NSFontAttributeName: font!]
    // This will give me an attributedString with the desired font
    let attributedString = NSMutableAttributedString(string: text!, attributes: titleDict as! [String : AnyObject])
    let regex = try? NSRegularExpression(pattern: "#(\\w+)", options: [])
    let matches = regex!.matches(in: text!, options: [], range: NSMakeRange(0, text!.characters.count))
    for match in matches {
        let matchRange = match.rangeAt(0)

        let titleDict: NSDictionary = [NSForegroundColorAttributeName: orangeColor]

        attributedString.addAttributes(titleDict as! [String : AnyObject], range: matchRange)
    }
    self.attributedText = attributedString
}

并以我选择的颜色突出显示所有#hashtags。但是它们不是可点击的,我在SO上发现了一些帖子说它无法实现:How to detect and make hyperlinks/mentions/hashtags clickable in UILabel?但它似乎已经过时了(希望如此)。你能给我一个提示吗?在控制台中显示所选主题标签的名称?

还有一件事要添加 - 我知道某些pod类似于ActiveLabel或类似的,但我尝试了它们并且在我的情况下遇到了约束问题,所以我想实现这个效果来自我自己的代码。

2 个答案:

答案 0 :(得分:1)

尝试在标签中添加UITapGestureRecognizer

let tap = UITapGestureRecognizer(target: self, action: #selector(handleLabelTap(_:)))
label.addGestureRecognizer(tap)

func handleLabelTap(_ sender: UITapGestureRecognizer) {

    // Do something here for when the user taps on the label

}

要使其正常工作,您可能需要将isUserInteractionEnabled设置为true以获取标签。我只是在Xcode中做了一个测试并且它有效。所以:

label.isUserInteractionEnabled = true

编辑:

如果要确定已触发哪个主题标签,请在类声明的顶部,在初始化之前为空UILabel数组创建属性,并为此创建一个空的UITapGestureRecognizer数组:< / p>

var labels:[UILabel] = [UILabel]()
var labelTaps:[UITapGestureRecognizer] = [UITapGestureRecognizer]()

然后,当您创建每个标签时,将标签和点击手势附加到每个相应的数组

let label = UILabel()
// Set all label properties as you wish

// Make sure to add
label.isUserInteractionEnabled = true

// Create the tap gesture
let tap = UITapGestureRecognizer(target: self, action: #selector(handleLabelTap(_:)))
label.addGestureRecognizer(tap)

labels.append(label)
labelTaps.append(tap)

然后,当用户点击其中一个哈希标记时,您可以获取向该方法发送哪个点击手势的索引,然后使用它来确定它是哪个标签,因为它具有相同的索引'labels'数组,因为它的各自的手势识别器将在'labelTaps'数组中。这是你如何做到的:

func handleLabelTap(_ sender: UITapGestureRecognizer) {

    if let index = labelTaps.index(of: sender) {

        let tappedLabel:UILabel = labels[index]

        // Now you can do whatever you want
        print("User tapped label with hash-tag: \(tappedLabel.text)")

    }

}

答案 1 :(得分:0)

您无法在Authorization: Bearer Mykey中点击链接,但您可以UILabelUITextField。这些允许添加可点击链接。

如果链接显示为链接,例如http://address@domain.com,则您只需打开链接检测即可。如果您希望链接显示任意字符串,如&#34;请单击此处&#34;并且使该字符串可以点击,您需要在文本字段/文本视图中安装属性字符串。

这些链接是什么类型的,您希望它在文本中看起来像什么?