gpt4 book ai didi

ios - 带有链接和 UITapGestureRecognizer 的 UILabel

转载 作者:搜寻专家 更新时间:2023-11-01 05:43:48 25 4
gpt4 key购买 nike

我有一个带有文本和链接的 UILabel。该链接只是文本的一部分而不是全部,但是,它在文本中的位置可以更改。

我已经使用 TTTAtributedLabel 来检测链接,现在我想在其余不是链接的文本上添加一个手势识别器。因为,链接位置可以更改,所以我不确定该怎么做。

如果没有外部库,这可能吗?

最佳答案

将其放入viewDidLoad:

self.textLabel.text = "Try to open https://www.google.com"
let text = self.textLabel.text
let sep = text?.components(separatedBy: " ")
for i in sep! {
if isURL(string: i) {
canopen.append(i)
}
}

更容易处理标签点击的扩展:

extension UITapGestureRecognizer {

func didTapText(in label: UILabel, range targetRange: NSRange) -> Bool {

let layoutManager = NSLayoutManager()
let textContainer = NSTextContainer(size: CGSize.zero)
let textStorage = NSTextStorage(string: label.text!)
layoutManager.addTextContainer(textContainer)
textStorage.addLayoutManager(layoutManager)

// Configuration must be the same as the label!
textContainer.lineFragmentPadding = 0.0
textContainer.lineBreakMode = label.lineBreakMode
textContainer.maximumNumberOfLines = label.numberOfLines
let labelSize = label.bounds.size
textContainer.size = labelSize

// Find the tapped character location and compare it to the specified range
let locationOfTouchInLabel = self.location(in: label)
let textBoundingBox = layoutManager.usedRect(for: textContainer)
let textContainerOffset = CGPoint(x: (labelSize.width - textBoundingBox.size.width) * 0.5 - textBoundingBox.origin.x, y: (labelSize.height - textBoundingBox.size.height) * 0.5 - textBoundingBox.origin.y)
let locationOfTouchInTextContainer = CGPoint(x: locationOfTouchInLabel.x - textContainerOffset.x, y: locationOfTouchInLabel.y - textContainerOffset.y)
let indexOfCharacter = layoutManager.characterIndex(for: locationOfTouchInTextContainer, in: textContainer, fractionOfDistanceBetweenInsertionPoints: nil)

return NSLocationInRange(indexOfCharacter, targetRange)
}

}

然后放置一个辅助函数来判断它是否是一个url:

func isURL(string: String?) -> Bool {
guard let urlString = string else {return false}
guard let url = URL(string: urlString) else {return false}
if !UIApplication.shared.canOpenURL(url) {return false}

let regEx = "((https|http)://)((\\w|-)+)(([.]|[/])((\\w|-)+))+"
let predicate = NSPredicate(format:"SELF MATCHES %@", argumentArray:[regEx])
return predicate.evaluate(with: string)
}

这就是要放入手势的 @IBAction 中的内容,其中 IBAction 的参数是 UITapGestureRecognizer,而不是 有吗?:

let text = self.textLabel.text

for i in canopen {
if sender.didTapText(in: textLabel, range: (text! as NSString).range(of: i)) {
print("Tapped on a link, so do nothing")
return
}
}

print("Did not tap on a link, so do something")
<#code#>

引用:http://samwize.com/2016/03/04/how-to-create-multiple-tappable-links-in-a-uilabel/

关于ios - 带有链接和 UITapGestureRecognizer 的 UILabel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43827781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com