UItextView с фотографией, чтобы открыть его в полноэкранном режиме - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь создать приложение, похожее на приложение Notes. У меня есть UITextView для отображения NSAttributedString. Я могу добавлять фотографии, используя NSTextAttachment, и все работает нормально.

Теперь, когда пользователь нажимает на фотографию, я хочу представить новую UIViewController, которая покажет нужную фотографию на весь экран. Как мне этого добиться? Приложение Notes имеет такое точное поведение.

1 Ответ

1 голос
/ 05 февраля 2020

Вот что я сделал, когда получил изображение из 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

    }

. Теперь используйте shouldInteractWith из textview, чтобы открыть изображение из 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-адрес, меняем его на данные и устанавливаем переменную изображения из другого контроллера представления для возвращаемых данных

Вот другой viewController


 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.

Вот и все. Вы можете установить навигационную кнопку на недавно открытом V C на go обратно к v c из textView

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...