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

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

4年前 (2021-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

相关文章

iOS APP逆向工程资料

最近在研究iOS逆向工程,整理了如下资料以供今后参考。概览工具清单做 iOS 逆向开发,要有的基本意识是,首先要有一台越狱设备,其次,要至少了解以下工具。工具名称作用Cydia越狱机上的安装软件包的软...

AuthKit之AKAnisetteData

   "X-Apple-I-MD" = "AAAABQAAABDWY2vBx3pIU8OPynC3vEvQAAAAAw=="; ...

微信iOS逆向之假装很多人点赞和评论

最近发现一个朋友喊我点赞,他正在某商圈吃饭,说点到60个赞可以获得一个免单卡。于是诞生了做一个模拟点赞、评论差插件的想法。HOOK代码如下// 模拟点赞 评论%hook WCDataItem- (id...

IOS开发已学完

最近一直在学习IOS开发,swift基本学会了,IOS编程基本就是语法与各种类库、UI组件的使用。有点编程基础很容易上手。Objective C的类库比swift多的多,不过还好swift可以调用Ob...

Swift 文件夹和文件操作

首先获取app文件夹:(以下例子都在doucment文件夹下操作)let manager = FileManager.default let urls:&nb...

APPStore协议研究

最近闲来无事研究iOS逆向,逆向了手机淘宝,HOOK淘宝的任意类和函数,后来又研究了APPStore,用抓包工具发现分析不到传输过程,分析他可能是指定了通讯用的证书,通过代理的证书他不信任。后来分析内...