iOS根据手指点击获取当前点击的句子
这个功能一般用于收藏某段话。
import UIKit class ViewController: UIViewController { let strings = "<style>p{text-indent: 2em;margin-bottom: 10px;line-height:30px}</style><p>你知道现在是什么季节吗?春天可真有趣呀!</p><p>你知道现在是什么季节吗?春天可真有趣呀!</p><p>你知道现在是什么季节吗?春天可真有趣呀!</p><p>你知道现在是什么季节吗?春天可真有趣呀!</p><p>你知道现在是什么季节吗?春天可真有趣呀!</p><p>你知道现在是什么季节吗?春天可真有趣呀!</p>"; @IBOutlet weak var contentLbl: UILabel! var layoutManager = NSLayoutManager() var textStorage = NSTextStorage() var textContainer = NSTextContainer() var attr:NSMutableAttributedString! override func viewDidLoad() { super.viewDidLoad() self.textStorage.addLayoutManager(self.layoutManager) self.layoutManager.addTextContainer(self.textContainer) let strData = self.strings.data(using: String.Encoding(rawValue: String.Encoding.unicode.rawValue), allowLossyConversion: true)! attr = try! NSMutableAttributedString.init(data: strData, options: [.documentType: NSAttributedString.DocumentType.html] , documentAttributes: nil) attr.addAttributes([NSAttributedString.Key.font:UIFont.systemFont(ofSize: 16)], range: NSMakeRange(0, attr.length)) attr.addAttributes([NSAttributedString.Key.foregroundColor:UIColor.black], range: NSMakeRange(0, attr.length)) attr.addAttributes([NSAttributedString.Key.backgroundColor:UIColor.orange], range: NSMakeRange(0, 10)) attr.addAttributes([NSAttributedString.Key.foregroundColor:UIColor.white], range: NSMakeRange(0, 10)) contentLbl.attributedText = attr let tap = UITapGestureRecognizer(target: self, action: #selector(onTap(sender:))) contentLbl.addGestureRecognizer(tap) contentLbl.isUserInteractionEnabled = true self.textStorage.setAttributedString(attr) self.textContainer.lineFragmentPadding = 0 } override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() self.textContainer.size = self.contentLbl.frame.size } @objc func onTap(sender:UITapGestureRecognizer) { let point = sender.location(in: self.contentLbl) let range = self.getWordRange(characterIndex: self.layoutManager.characterIndex(for: point, in: self.textContainer, fractionOfDistanceBetweenInsertionPoints: nil)) attr.addAttributes([NSAttributedString.Key.foregroundColor:UIColor.black], range: NSMakeRange(0, attr.length)) attr.addAttributes([NSAttributedString.Key.backgroundColor:UIColor.clear], range: NSMakeRange(0, attr.length)) attr.addAttributes([NSAttributedString.Key.backgroundColor:UIColor.orange], range: range) attr.addAttributes([NSAttributedString.Key.foregroundColor:UIColor.white], range: range) contentLbl.attributedText = attr let string = attr.string let startIndex = string.index(string.startIndex, offsetBy: range.location) let endIndex = string.index(string.startIndex, offsetBy: range.location+range.length) let s = String(attr.string[startIndex..<endIndex]) print(s) } // 根据点击的文字 获取当前文字所处句子的范围 func getWordRange(characterIndex:NSInteger) -> NSRange { var left = characterIndex - 1 var right = characterIndex + 1 let string = self.attr.string while left >= 0 { let startIndex = string.index(string.startIndex, offsetBy: left) let endIndex = string.index(string.startIndex, offsetBy: left+1) let s = String(string[startIndex..<endIndex]) if isOver(str: s) { break }else{ left-=1 } } while right < string.count { let startIndex = string.index(string.startIndex, offsetBy: right-1) let endIndex = string.index(string.startIndex, offsetBy: right) let s = String(string[startIndex..<endIndex]) if isOver(str: s) { break }else{ right+=1 } } left+=1 right-=1 return NSMakeRange(left, right - left + 1) } // 当前句子是否已结束 func isOver(str:String) -> Bool { let overArr = ["!","。","?"] return overArr.contains(str) } }