在 UITextView 中使图像可点击

Posted

技术标签:

【中文标题】在 UITextView 中使图像可点击【英文标题】:Make image clickable in UITextView 【发布时间】:2020-03-27 20:14:04 【问题描述】:

我正在尝试创建一个笔记应用程序,您可以在其中单击图像以及正常编辑文本。

目前,我在 UITextView 上放置了一个点击手势识别器,它调用:

    @IBAction func onImageTap(_ sender: UITapGestureRecognizer) 
        if sender.state == .ended 
            let textView = sender.view as! UITextView
            let layoutManager = textView.layoutManager

            // location of tap in textView coordinates
            var location = sender.location(in: textView)
            location.x -= textView.textContainerInset.left;
            location.y -= textView.textContainerInset.top;

            // character index at tap location
            let characterIndex = layoutManager.characterIndex(for: location, in: textView.textContainer, fractionOfDistanceBetweenInsertionPoints: nil)

            // if index is valid
            if characterIndex < textView.textStorage.length 

                // check if the tap location has the image attribute
                let attributeValue = textView.attributedText.attribute(NSAttributedString.Key.fileType, at: characterIndex, effectiveRange: nil) as? String
                // if location does have custom attribute, extract the url of the PDF and perform segue to display PDF
                if let value = attributeValue 
                    if value == "PDF" 
                        storedFileName = textView.attributedText.attribute(NSAttributedString.Key.fileName, at: characterIndex, effectiveRange: nil) as? String
                        performSegue(withIdentifier: "displayPDF", sender: textView)
                    
                 else 
                    textView.isEditable = true
                    textView.becomeFirstResponder()
                
            
        
    

这使得所有图片都可以点击。但是,然后我无法单击 UITextView 中的其他任何位置来编辑文本。

我该怎么做才能使图像保持可点击状态,但如果我点击 UITextView 中的其他任何位置,我就可以开始编辑文本?

【问题讨论】:

textView.becomeFirstResponder() 使其可编辑,但仅当 attributeValue 为空时才调用它。您应该考虑其他条件块。 【参考方案1】:

假设您已将图像作为NSAttachment 添加到UITextView,从ios 9.0 开始,您可以检查给定的NSRange 是否包含附件:

例如,如果图像位于第 25 个字符:

let characterIndex = 25
let range = NSRange(location: characterIndex, length: 1)

// Using an IBOutlet in the current view controller called 'textView'
if textView.attributedText.containsAttachments(in: range) 
    // Do some activity

【讨论】:

以上是关于在 UITextView 中使图像可点击的主要内容,如果未能解决你的问题,请参考以下文章

如何在滚动视图中使 UIImage 低于 UILabel 或 UITextView

使用不可见的 UILabel 并触发 UITextView 事件或不使用 UILabel 并处理 UITextView 点击识别器

如何在 IE7 中使空的锚标记可点击?

如何使用 React JS 在 Material UI 中使整个 Card 组件可点击?

使用自动布局问题在 UIScrollView 中调整 UITextView 的大小

iOS6 和 UITableView 中的屏幕外 UITextView