带有照片的 UItextView 全屏打开它
Posted
技术标签:
【中文标题】带有照片的 UItextView 全屏打开它【英文标题】:UItextView with photo to open it in fullscreen 【发布时间】:2020-02-05 13:23:59 【问题描述】:我正在尝试制作一个类似于 Notes 应用的应用。我有一个UITextView
来显示NSAttributedString
。我可以使用NSTextAttachment
添加照片,一切正常。
现在,当用户点击照片时,我想展示一个新的UIViewController
,它将全屏显示所需的照片。我如何实现这一目标? Notes 应用程序具有这种确切的行为。
【问题讨论】:
这能回答你的问题吗? How to detect touch on NSTextAttachment 使用 UITextView 是不可能的。如果要单击图像,则需要停止 UITextView 用户交互。如果您停止交互,则 UITextView 不可编辑。因此,使用 UITextView 您无法满足您的要求。这是浪费时间。 Notes 应用程序功能有所不同。它使用 textview,但不完全。 【参考方案1】:这就是我所做的 从 didFinishPickingMediaWithInfo 获取图像后,我将获得图像 URL
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])
picker.dismiss(animated: true)
//1 Make a NSAttachmentVariable
let attachment = NSTextAttachment()
guard let image = info[.editedImage] as? UIImage else
print("No image found")
return
//2 get the ImageURL
guard let imageURL = info[.imageURL] as? URL else
print("No url")
return
//3 optional Resize the image
let resizedImage = self.resizeImage(image: image, targetSize: CGSize(width: txtView.frame.size.width, height: 200))
//4 add the fetched image to the attachment created earlier to display on text view
attachment.image = resizedImage
//5 insert the attachment to the textview
let attString = NSMutableAttributedString(attachment: attachment)
txtView.textStorage.insert(attString, at: txtView.selectedRange.location)
//6 get the range of the whole image from the textview string
let range = NSString(string: attString.string).range(of: attString.string, options: String.CompareOptions.caseInsensitive)
//7 add the fetched image url we got earlier at //2 to the attachment
attString.addAttribute(.link, value: imageURL, range: range)
//8 add the attributed text to the text view
txtView.attributedText = attString
现在使用 textview 中的 shouldInteractWith 从 url 打开图像,不要忘记将 UITextViewDelegate 添加为控制器的扩展
func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool
let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "Details") as! DetailsImage
let data = try? Data(contentsOf: URL)
if let imageData = data
newViewController.image = UIImage(data: imageData)!
self.present(newViewController, animated: true, completion: nil)
//UIApplication.shared.open(URL)
return false
这用于从您的文本视图打开 url,现在我们正在使用我们获得的 url,将其更改为数据并将图像变量从另一个视图控制器设置为返回的数据
这是另一个视图控制器
import UIKit
class DetailsImage: UIViewController
var image = UIImage()
@IBOutlet weak var imgView: UIImageView!
override func viewDidLoad()
imgView.image = image
重要提示:
点击不能很简短,这意味着 ios 会忽略快速点击。如果你觉得这很烦人,你可以考虑这样:https://gist.github.com/benjaminbojko/c92ac19fe4db3302bd28。
就是这样你可以在新打开的VC上设置导航按钮回到textView的vc
【讨论】:
以上是关于带有照片的 UItextView 全屏打开它的主要内容,如果未能解决你的问题,请参考以下文章