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)
}
}
