当前位置:首页 > iOS > 正文内容

iOS根据手指点击获取当前点击的句子

5个月前 (03-17)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)
    }
    
}


扫描二维码推送至手机访问。

版权声明:本文由小祥子的博客发布,如需转载请注明出处。

本文地址:http://www.xiaoxiangzi.com/post/94.html

相关文章

Objective C GCD延时执行

dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0/*延迟执行...

iPhone HOOK将所有请求保存到txt

p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Consolas; color: #f9f9f5} p.p2 {margin: 0.0px 0...

iOS逆向,微信步数修改

iOS逆向,微信步数修改

hook住WCDeviceStepObject和SportDeviceInfo的两个方法就可以了代码如下@interface WCDeviceStepObject : NSObject-(unsign...

APPStore协议之登录接口

以前还能用各种软件抓APPStore的HTTPS通讯过程,现在不行了。不过还是抓到了。登录地址:https://buy.itunes.apple.com/WebObjects/MZFinance.wo...

iOS统计代码行数

cd到工程目录find . "(" -name "*.swift" -or -name "*.xib" ")"...

iOS layer addAnimation动画

使用方法:[view.layer addAnimation:<#(nonnull CAAnimation *)#> forKey:nil]+(CAT...