• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 在 UITextview 中获取被点击的单词

[复制链接]
菜鸟教程小白 发表于 2022-12-11 19:40:22 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我添加了一个最初不可编辑的 uitextview。我添加了一个轻击手势,使编辑变为真。在点击手势选择器中,我得到了正在点击的单词。我尝试了很多解决方案,但没有一个适合我作为完整的解决方案。如果不滚动 TextView ,每个解决方案都有效。但是,如果我滚动 TextView ,则不会检索到确切的单词。这是我获取点击词的代码:

 @objc func handleTap(_ sender: UITapGestureRecognizer) {

    notesTextView.isEditable = true
    notesTextView.textColor = UIColor.white

    if let textView = sender.view as? UITextView {

        var pointOfTap = sender.location(in: textView)
        print("x:\(pointOfTap.x) , y:\(pointOfTap.y)")

        let contentOffsetY = textView.contentOffset.y
        pointOfTap.y += contentOffsetY
        print("x:\(pointOfTap.x) , y:\(pointOfTap.y)")
        word(atPosition: pointOfTap)

 }

func word(atPosition: CGPoint) -> String? {
    if let tapPosition = notesTextView.closestPosition(to: atPosition) {
        if let textRange = notesTextView.tokenizer.rangeEnclosingPosition(tapPosition , with: .word, inDirection: 1) {
            let tappedWord = notesTextView.text(in: textRange)
            print("Word: \(tappedWord)" ?? "")
            return tappedWord
        }
        return nil
    }
    return nil
}

已编辑:

这是有问题的演示项目。 https://github.com/amrit42087/TextViewDemo



Best Answer-推荐答案


Swift 4 中最好最简单的方法

方法 1:

第 1 步:在 TextView 上添加点按手势

let tap = UITapGestureRecognizer(target: self, action: #selector(tapResponse(recognizer))

textViewTC.addGestureRecognizer(tap)

第 2 步:实现点击手势

@objc func tapResponse(recognizer: UITapGestureRecognizer) {
        let location: CGPoint = recognizer.location(in: textViewTC)
        let position: CGPoint = CGPoint(x: location.x, y: location.y)
        let tapPosition: UITextPosition = textViewTC.closestPosition(to: position)!
        guard let textRange: UITextRange = textViewTC.tokenizer.rangeEnclosingPosition(tapPosition, with: UITextGranularity.word, inDirection: 1) else {return}

        let tappedWord: String = textViewTC.text(in: textRange) ?? ""
        print("tapped word ->", tappedWord)
    }

是的,就是这样。去吧。

方法 2:

另一种方法是您可以为 textview 启用链接,然后将其设置为属性。这是一个例子

var foundRange = attributedString.mutableString.range(of: "Terms of Use") //mention the parts of the attributed text you want to tap and get an custom action
attributedString.addAttribute(NSAttributedStringKey.link, value: termsAndConditionsURL, range: foundRange)

将此属性文本设置为Textview和textView.delegate = self

现在你只需要在

中处理响应
func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {

希望对您有所帮助。一切顺利。

关于ios - 在 UITextview 中获取被点击的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48474488/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap