当前位置:首页 > 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

相关文章

APPStore协议研究

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

AuthKit之AKAccountManager

+ (BOOL)isAccountsFrameworkAvailable;检测服务是否可用- (id)_tokenWithName:(id)arg1 forAccount:(id)arg2;生成tok...

iOS 13 SceneDelegate删除

IOS13之后,生命周期时间就开始由UISceneDelegate接管。解决适配方案:删除掉info.plist中Application Scene Manifest选项,同时可以删除Scenedel...

iOS OC文件大小计算

+ (NSString *)fileSizeWithInterge:(NSInteger)size{     if (size&...

两次登录POST参数对比

接口地址https://p19-buy.itunes.apple.com/WebObjects/MZFinance.woa/wa/authenticate同一个账号进行两次登录对比X-Apple-AM...

iOS逆向,微信步数修改

iOS逆向,微信步数修改

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