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

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

7个月前 (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 OC文件大小计算

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

iOS APP逆向工程资料

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

两次登录POST参数对比

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

iOS 13 SceneDelegate删除

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

AuthKit之AKAnisetteData

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

iOS ocr文字识别

因为项目需要,所以调查了一个关于ocr识别的相关资料。这里分手写识别与打印体识别:1.手写识别,可集成百度的SDK,但是要收费。2.打印体识别,可集成开源项目tesseract https:...