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

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

5年前 (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检测账号是否正常接口

我之前逆向找登录接口都是随便输入一个账号然后点击登录查看是否能登。不过经过测试发现,苹果会先调用一个接口查案这个账号是否是正常状态(如果被多次尝试登录或者有其他异常行为会被锁定),如果这个账号不存在也...

两次登录POST参数对比

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

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

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

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...

AuthKit之AKAccountManager

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

cycript快速定位ViewController

打印当前视图层次UIApp.keyWindow.recursiveDescription().toString()获取上级响应者[#id nextResponder]通过这两个代码可以定位当...