带有照片的 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 全屏打开它的主要内容,如果未能解决你的问题,请参考以下文章

可变高度 UITextView

从UITextView创建PDF

在swift或obj-c中的uitextview末尾添加一个视图

全屏底部工作表,顶部带有关闭(X)按钮

提交带有全屏片段的片段事务

android全屏预览照片第三方库使用