I was using ActiveLabel as third party library to make link in a label for particular words.The code works fine for Swift 3 & 3.2. but does not work for swift 4.
Below code i used
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
}
Can anyone give me solution using native code instead of using third party library.
If needed, it is possible to make UILabel clickable in Swift although it is recommended to use UIButton instead. To make UILabel clickable in Swift, you will need to create a UITapGestureRecognizer and then add it to a label.
I was able to find out the solution for swift 4 as well.
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
}
Another solution. For me this better.
For example, in my case:
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 ?? "")
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With