Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to detect link in UILabel in swift 4?

Tags:

ios

uilabel

swift

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.

like image 694
TechChain Avatar asked Nov 16 '17 14:11

TechChain


People also ask

How do you make a UILabel clickable in Swift?

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.


2 Answers

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
            }
like image 51
TechChain Avatar answered Nov 15 '22 00:11

TechChain


Another solution. For me this better.

  1. Get your text from the UILabel.
  2. Unwrape this text
  3. Do what you want

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 ?? "")
like image 25
Koder 228 Avatar answered Nov 15 '22 01:11

Koder 228