我正在尝试制作与Notes应用类似的应用。我有一个UITextView
显示NSAttributedString
。我可以使用NSTextAttachment
添加照片,并且一切正常。
[现在,当用户点击照片时,我想显示一个新的UIViewController
,它将以全屏显示所需的照片。我该如何实现? Notes应用具有确切的行为。
这是我所做的一旦我从didFinishPickingMediaWithInfo获取图像,我就会获得图像URL
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
picker.dismiss(animated: true)
//1
let attachment = NSTextAttachment()
guard let image = info[.editedImage] as? UIImage else {
print("No image found")
return
}
//2
guard let imageURL = info[.imageURL] as? URL else {
print("No url")
return
}
//3
let resizedImage = self.resizeImage(image: image, targetSize: CGSize(width: txtView.frame.size.width, height: 200))
//4
attachment.image = resizedImage
//5
let attString = NSMutableAttributedString(attachment: attachment)
txtView.textStorage.insert(attString, at: txtView.selectedRange.location)
//6
let range = NSString(string: attString.string).range(of: attString.string, options: String.CompareOptions.caseInsensitive)
//7
attString.addAttribute(.link, value: imageURL, range: range)
//8
txtView.attributedText = attString
}
// 1
制作NSAttachmentVariable
// 2
获取ImageURL
// 3可选调整图像大小
// 4
将获取的图像添加到先前创建的附件中以显示在文本视图中
// 5
将附件插入到文本视图中
// 6
从textview字符串中获取整个图像的范围
// 7
将我们在// 2之前获得的获取的图像URL添加到附件中
// 8
将属性文本添加到文本视图中
现在使用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,将其更改为data并将图像变量从另一个view controller设置为返回的数据
这里是另一个viewController
import UIKit
class DetailsImage: UIViewController{
var image = UIImage()
@IBOutlet weak var imgView: UIImageView!
override func viewDidLoad() {
imgView.image = image
}
}
就是这样,您可以在新打开的VC上设置导航按钮以返回到textView的vc