UITextView highlight all matches using swift

前端 未结 7 1451
南方客
南方客 2020-12-08 09:26

I want to highlight all matches word with searching. I wrote code but I couldn\'t use a loop. When i search a word, my app find words and highlight only first word. here is

相关标签:
7条回答
  • 2020-12-08 09:33

    I want to little improve the solution provided by @Barath and @Bruno Paulino, as this solution won't work with escaped characters like {}[]()'", this solution works with escaped characters, this solution written in SWIFT 5.

    func generateAttributedString(with searchTerm: String, targetString: NSAttributedString) -> NSAttributedString? {
        let attributedString = NSMutableAttributedString(attributedString: targetString)
        do {
    
            let regex = try NSRegularExpression(pattern:  NSRegularExpression.escapedPattern(for: searchTerm).trimmingCharacters(in: .whitespacesAndNewlines).folding(options: .regularExpression, locale: .current), options: .caseInsensitive)
            let range = NSRange(location: 0, length: targetString.string.utf16.count)
            attributedString.addAttribute(NSAttributedString.Key.backgroundColor, value: UIColor.clear, range: range)
            for match in regex.matches(in: targetString.string.folding(options: .regularExpression, locale: .current), options: .withTransparentBounds, range: range) {
                attributedString.addAttribute(NSAttributedString.Key.backgroundColor, value: UIColor.yellow, range: match.range)
            }
            return attributedString
        } catch {
            NSLog("Error creating regular expresion: \(error)")
            return nil
        }
    }
    
    0 讨论(0)
  • 2020-12-08 09:35

    Solved.

    this is new :

    var count = 0
    let attributedText = NSMutableAttributedString(attributedString: txtMetin2.attributedText)
    let text2 = txtArama.text as NSString
    let text = txtMetin2.text as NSString
    println("\(text.length)")
    println("\(text2.length)")
    var range:NSRange
    var checker:NSString = ""
    
    for(var i=0 ; i <= text.length - text2.length ; i++)
    {
        range = NSMakeRange(i, text2.length)
        checker = text.substringWithRange(range)
        if(text2 == checker)
        {
            attributedText.addAttribute(NSBackgroundColorAttributeName, value: UIColor.yellowColor(),
                range: range)
            let textAttachment = NSTextAttachment()
            let textAttachmentString = NSAttributedString(attachment: textAttachment)
            attributedText.appendAttributedString(textAttachmentString)
            txtMetin2.attributedText = attributedText
            count++
        }
    }
    println("\(count)")
    

    i used range variable instead of highlighted range in attributedText.addAtrribute()

    0 讨论(0)
  • Obligatory NSRegularExpression based solution.

    let searchString = "this"
    let baseString = "This is some string that contains the word \"this\" more than once. This substring has multiple cases. ThisthisThIs."
    
    let attributed = NSMutableAttributedString(string: baseString)
    
    var error: NSError?
    let regex = NSRegularExpression(pattern: searchString, options: .CaseInsensitive, error: &error)
    
    if let regexError = error {
        println("Oh no! \(regexError)")
    } else {
        for match in regex?.matchesInString(baseString, options: NSMatchingOptions.allZeros, range: NSRange(location: 0, length: baseString.utf16Count)) as [NSTextCheckingResult] {
            attributed.addAttribute(NSBackgroundColorAttributeName, value: UIColor.yellowColor(), range: match.range)
        }
    
        textView.attributedText = attributed
    }
    
    0 讨论(0)
  • 2020-12-08 09:41

    you can use the following function passing the search input and the current content. that will return a NSAttributedString? that you can set in your TextView

    Swift 3

    func generateAttributedString(with searchTerm: String, targetString: String) -> NSAttributedString? {
        let attributedString = NSMutableAttributedString(string: targetString)
        do {
            let regex = try NSRegularExpression(pattern: searchTerm, options: .caseInsensitive)
            let range = NSRange(location: 0, length: targetString.utf16.count)
            for match in regex.matches(in: targetString, options: .withTransparentBounds, range: range) {
                attributedString.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: 16, weight: UIFontWeightBold), range: match.range)
            }
            return attributedString
        } catch _ {
            NSLog("Error creating regular expresion")
            return nil
        }
    }
    

    Edit:

    highlight with diacritic insensitive option:

    func generateAttributedString(with searchTerm: String, targetString: String) -> NSAttributedString? {
    
        let attributedString = NSMutableAttributedString(string: targetString)
        do {
            let regex = try NSRegularExpression(pattern: searchTerm.trimmingCharacters(in: .whitespacesAndNewlines).folding(options: .diacriticInsensitive, locale: .current), options: .caseInsensitive)
            let range = NSRange(location: 0, length: targetString.utf16.count)
            for match in regex.matches(in: targetString.folding(options: .diacriticInsensitive, locale: .current), options: .withTransparentBounds, range: range) {
                attributedString.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: 16, weight: UIFontWeightBold), range: match.range)
            }
            return attributedString
        } catch {
            NSLog("Error creating regular expresion: \(error)")
            return nil
        }
    }
    
    0 讨论(0)
  • 2020-12-08 09:45

    Improved customized solution for Swift 4.2

    extension NSAttributedString {
        convenience init(base: String,
                         keyWords: [String],
                         foregroundColor: UIColor,
                         font: UIFont,
                         highlightForeground: UIColor,
                         highlighBackground: UIColor) {
            let baseAttributed = NSMutableAttributedString(string: base, attributes: [NSAttributedString.Key.font: font,
                                                                                      NSAttributedString.Key.foregroundColor: foregroundColor])
            let range = NSRange(location: 0, length: base.utf16.count)
            for word in keyWords {
                guard let regex = try? NSRegularExpression(pattern: word, options: .caseInsensitive) else {
                    continue
                }
    
                regex
                    .matches(in: base, options: .withTransparentBounds, range: range)
                    .forEach { baseAttributed
                        .addAttributes([NSAttributedString.Key.backgroundColor: highlighBackground,
                                        NSAttributedString.Key.foregroundColor: highlightForeground],
                                       range: $0.range) }
            }
            self.init(attributedString: baseAttributed)
        }
    }
    
    0 讨论(0)
  • 2020-12-08 09:46

    Uitextview highlight all matches word swift 3.0

     let searchString = "Lorem Ipsum"
     let baseString = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard .Containing LOREM IPSUM passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem IPSUM"
    
    
    
    let attributed = NSMutableAttributedString(string: baseString)
        do
        {
            let regex = try! NSRegularExpression(pattern: searchString,options: .caseInsensitive)
            for match in regex.matches(in: baseString, options: NSRegularExpression.MatchingOptions(), range: NSRange(location: 0, length: baseString.characters.count)) as [NSTextCheckingResult] {
                attributed.addAttribute(NSBackgroundColorAttributeName, value: UIColor.yellow, range: match.range)
            }
            self.txtView.attributedText = attributed
        }
    

    click here to see image

    0 讨论(0)
提交回复
热议问题