我使用ImagePickerController在UITextView
中添加了图片。
如果其中只有文字,则表示平滑,但在添加3或4张图片后,其内容中的滚动会变得迟钝。
我在添加图像时压缩图像,质量最低,但我必须做错事,因为它仍然落后于第三张图像。
以下是代码:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
guard let _image = info[UIImagePickerControllerOriginalImage] as? UIImage else { return }
self.dismiss(animated: true, completion: nil)
// Compress the retrieved image
let compressedImage = UIImage(data: _image.lowestQualityJPEGNSData!)
//create and NSTextAttachment and add your image to it.
let attachment = NSTextAttachment()
let oldWidth = compressedImage?.size.width // scales it within the UITextView
let scaleFactor = oldWidth! / (bodyEditText.frame.size.width - 10); // adjusts the desired padding
attachment.image = UIImage(cgImage: (compressedImage?.cgImage!)!, scale: scaleFactor, orientation: .up)
//put your NSTextAttachment into and attributedString
let attString = NSAttributedString(attachment: attachment)
//add this attributed string to the current position.
bodyEditText.textStorage.insert(attString, at: bodyEditText.selectedRange.location)
}
extension UIImage {
var uncompressedPNGData: Data? { return UIImagePNGRepresentation(self) }
var highestQualityJPEGNSData: Data? { return UIImageJPEGRepresentation(self, 1.0) }
var highQualityJPEGNSData: Data? { return UIImageJPEGRepresentation(self, 0.75) }
var mediumQualityJPEGNSData: Data? { return UIImageJPEGRepresentation(self, 0.5) }
var lowQualityJPEGNSData: Data? { return UIImageJPEGRepresentation(self, 0.25) }
var lowestQualityJPEGNSData:Data? { return UIImageJPEGRepresentation(self, 0.0) }
}
可能导致此问题的原因和任何提示我如何能够超越此问题?
感谢您的帮助
修改
感谢Duncan C,我设法消除了整个延迟并提高了渲染图像的性能。
我已将imagePickerController
替换为以下内容:
let size = __CGSizeApplyAffineTransform(_image.size, CGAffineTransform.init(scaleX: 0.3, y: 0.3))
let hasAlpha = false
let scale: CGFloat = 0.0 // Automatically use scale factor of main screen
UIGraphicsBeginImageContextWithOptions(size, !hasAlpha, scale)
_image.draw(in: CGRect(origin: CGPoint.zero, size: size))
let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
let att = NSTextAttachment()
att.image = scaledImage
//put your NSTextAttachment into and attributedString
let attString = NSAttributedString(attachment: att)
//add this attributed string to the current position.
bodyEditText.textStorage.insert(attString, at: bodyEditText.selectedRange.location)
答案 0 :(得分:1)
您滥用比例因子。这是用于处理正常,视网膜和@ 3x视网膜图像的1倍,2倍和3倍缩放。
您进行此操作的方式,系统必须在每次想要绘制一个矩形时将全尺寸图像渲染到边界矩形中。如果图像比您显示的图像大得多,则会浪费大量内存和处理时间。
首先尝试将图片视图contentMode
设置为.scaleAspectFit
,然后在图片视图中安装原始图片,而不会影响缩放系数。看看它的表现如何。
如果这不能提供可接受的性能,则应将起始图像渲染到离屏图形上下文中,该图形上下文是图像的目标大小,并将重新渲染的图像安装到图像视图中。您可以使用UIGraphicsBeginImageContextWithOptions()
或其他各种技术调整图片大小以供显示。
有关图像缩放和调整大小的信息,请查看此链接:
答案 1 :(得分:1)
这不是最好的做法。 UITextViews适用于文本而非所有视图。
你需要制作一个自定义的UIView,包含一个1,textview 2,UICollectionView,用于多个图像。
通过这种方式,您可以在整个项目中的许多地方重复使用此自定义视图