我使用ActiveLabel作为第三方库在特定单词的标签中建立链接。代码适用于Swift 3& 3.2。但不适用于swift 4。
我使用的代码
let customType1 = ActiveType.custom(pattern: "\\sTerms & Conditions\\b") //Looks for "are"
labelTc.enabledTypes.append(customType1)
labelTc.customize { (label) in
labelTc.text = "UserAgreement".localized
label.numberOfLines = 0
label.lineSpacing = 4
label.textColor = UIColor(red: 131 / 255, green: 147 / 255, blue: 168 / 255, alpha: 1)
//Custom types
label.customColor[customType1] = Constant.AppColor.greenMeadow
label.customSelectedColor[customType1] = Constant.AppColor.greenMeadow
label.configureLinkAttribute = { (type, attributes, isSelected) in
var atts = attributes
switch type {
case customType1:
atts[NSAttributedStringKey.font._rawValue as String] = UIFont(name: self.labelTc.font.fontName, size: 15.0)
atts[NSAttributedStringKey.underlineStyle.rawValue] = NSUnderlineStyle.styleSingle
break
case .mention:
break
case .hashtag:
break
case .url:
break
case .custom(let pattern):
break
default :
break
}
return atts
}
任何人都可以使用本机代码而不是第三方库给我解决方案。
答案 0 :(得分:2)
我也能找到swift 4的解决方案。
label.configureLinkAttribute = { (type, attributes, isSelected) in
var atts = attributes
switch type {
case customType1:
atts[NSAttributedStringKey.font.rawValue] = UIFont(name: self.labelTc.font.fontName, size: 15.0)
atts[NSAttributedStringKey.underlineStyle.rawValue] = NSUnderlineStyle.styleSingle.rawValue
break
default: ()
}
return atts
}
答案 1 :(得分:0)
Another solution。对我来说更好。
例如,在我的情况下:
struct DetectedLinkData {
var link: URL
var range: Range<String.Index>
init(link: URL, range: Range<String.Index>) {
self.link = link
self.range = range
}
}
class LinkDetecter {
static func getLinks(in string: String) -> [DetectedLinkData] {
guard let detector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) else {
return []
}
var result: [DetectedLinkData] = []
let matches = detector.matches(in: string, options: [], range: NSRange(location: 0, length: string.utf16.count) )
for match in matches {
guard let range = Range(match.range, in: string),
let url = URL(string: String(string[range]) )
else {
continue
}
result.append(DetectedLinkData(link: url, range: range))
}
return result
}
}
let temp = LinkDetecter.getLinks(in: message["text"] as? String ?? "")