// // NSAttributedString+Extension.swift // QuickSearchLocation // // Created by Destiny on 2024/11/27. // import UIKit extension NSAttributedString { func setRangeFontText(font: UIFont, range: NSRange) -> NSAttributedString { return setSpecificRangeTextMoreAttributes(attributes: [NSAttributedString.Key.font : font], range: range) } func setSpecificTextColor(_ text: String, color: UIColor) -> NSAttributedString { return setSpecificTextMoreAttributes(text, attributes: [NSAttributedString.Key.foregroundColor : color]) } func setSpecificRangeTextMoreAttributes(attributes: Dictionary, range: NSRange) -> NSAttributedString { let mutableAttributedString = NSMutableAttributedString(attributedString: self) for name in attributes.keys { mutableAttributedString.addAttribute(name, value: attributes[name] ?? "", range: range) } return mutableAttributedString } func setSpecificTextColorFont(_ text: String, color: UIColor, font: UIFont) -> NSAttributedString { return setSpecificTextMoreAttributes(text, attributes: [NSAttributedString.Key.foregroundColor : color, NSAttributedString.Key.font : font]) } func setSpecificTextMoreAttributes(_ text: String, attributes: Dictionary) -> NSAttributedString { let mutableAttributedString = NSMutableAttributedString(attributedString: self) let rangeArray = getStringRangeArray(with: [text]) if !rangeArray.isEmpty { for name in attributes.keys { for range in rangeArray { mutableAttributedString.addAttribute(name, value: attributes[name] ?? "", range: range) } } } return mutableAttributedString } private func getStringRangeArray(with textArray: Array) -> Array { var rangeArray = Array() // 遍历 for str in textArray { if self.string.contains(str) { let subStrArr = self.string.components(separatedBy: str) var subStrIndex = 0 for i in 0 ..< (subStrArr.count - 1) { let subDivisionStr = subStrArr[i] if i == 0 { subStrIndex += (subDivisionStr.lengthOfBytes(using: .unicode) / 2) } else { subStrIndex += (subDivisionStr.lengthOfBytes(using: .unicode) / 2 + str.lengthOfBytes(using: .unicode) / 2) } let newRange = NSRange(location: subStrIndex, length: str.count) rangeArray.append(newRange) } } } return rangeArray } }