在 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 点击识别器
如何使用 React JS 在 Material UI 中使整个 Card 组件可点击?