大 UIImage 未显示在 UIImageView 中
Large UIImage not showing in UIImageView
我正在捕获 UIWebView 的整页屏幕截图并通过 segue 传递图像:
// WebViewController.swift
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "captureSegue" {
var captureViewcontroller:CaptureViewController = segue.destinationViewController as! CaptureViewController
captureViewcontroller.tempCaptureImage = image
}
}
然后 UIImage 被保存到应用程序目录中的 Documents/Images
就好了。如果我从文件系统打开它,它在预览中显示得很好。但是,如果屏幕截图非常大,则图像不会显示在 UIImageView 中。 UIImageView 呈现空白。添加断点显示图像数据是有的,只是没有渲染。
// CaptureViewController.swift
var tempCaptureImage: UIImage?
@IBOutlet weak var imageScrollView: UIScrollView!
@IBOutlet weak var captureImageView: UIImageView!
@IBOutlet weak var titleField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
self.automaticallyAdjustsScrollViewInsets = false
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
if let image = tempCaptureImage {
captureImageView.frame = CGRect(origin: CGPoint(x: 0, y: 0), size: image.size)
captureImageView.image = image
imageScrollView.contentSize = image.size
let scrollViewFrame = imageScrollView.bounds
let scaleWidth = scrollViewFrame.size.width / imageScrollView.contentSize.width
let scaleHeight = scrollViewFrame.size.height / imageScrollView.contentSize.height
let minScale = min(scaleWidth, scaleHeight);
imageScrollView.minimumZoomScale = minScale;
imageScrollView.maximumZoomScale = 1.0
imageScrollView.zoomScale = minScale;
}
}
会不会是图片太大了?如果我捕获的页面较小,则图像显示得很好。有没有推荐的在 iDevices 上查看大图像的技巧?
编辑:
这是带断点的变量视图的输出。也许你看到了我遗漏的东西。
您没有提供有关图像实际大小的任何信息,因此无法说出您可能达到的限制。但请记住,与单比例图像相比,三比例图像会将底层位图内存大小乘以 9。那是一个数量级!我完全相信,如果您尝试访问太大的图像,您会很快超出应用程序的内存容量,甚至会崩溃。所以第一步肯定是将图像加载为单比例图像;请参阅 ImageIO 框架以了解如何执行此操作。如果您想知道如何显示非常大的图像,另请参阅 CATiledLayer 上的文档。
对于有类似问题的人,也许尝试在真实设备上进行测试。对我来说,尺寸为 1000 x 7000 的图像不会显示在 Simulator 或 Interface Builder 中,但可以在 iPhone 6s plus 中显示。
此外,如果图像尺寸大于 10000 x 10000,Interface Builder 会报错。
我正在捕获 UIWebView 的整页屏幕截图并通过 segue 传递图像:
// WebViewController.swift
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "captureSegue" {
var captureViewcontroller:CaptureViewController = segue.destinationViewController as! CaptureViewController
captureViewcontroller.tempCaptureImage = image
}
}
然后 UIImage 被保存到应用程序目录中的 Documents/Images
就好了。如果我从文件系统打开它,它在预览中显示得很好。但是,如果屏幕截图非常大,则图像不会显示在 UIImageView 中。 UIImageView 呈现空白。添加断点显示图像数据是有的,只是没有渲染。
// CaptureViewController.swift
var tempCaptureImage: UIImage?
@IBOutlet weak var imageScrollView: UIScrollView!
@IBOutlet weak var captureImageView: UIImageView!
@IBOutlet weak var titleField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
self.automaticallyAdjustsScrollViewInsets = false
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
if let image = tempCaptureImage {
captureImageView.frame = CGRect(origin: CGPoint(x: 0, y: 0), size: image.size)
captureImageView.image = image
imageScrollView.contentSize = image.size
let scrollViewFrame = imageScrollView.bounds
let scaleWidth = scrollViewFrame.size.width / imageScrollView.contentSize.width
let scaleHeight = scrollViewFrame.size.height / imageScrollView.contentSize.height
let minScale = min(scaleWidth, scaleHeight);
imageScrollView.minimumZoomScale = minScale;
imageScrollView.maximumZoomScale = 1.0
imageScrollView.zoomScale = minScale;
}
}
会不会是图片太大了?如果我捕获的页面较小,则图像显示得很好。有没有推荐的在 iDevices 上查看大图像的技巧?
编辑:
这是带断点的变量视图的输出。也许你看到了我遗漏的东西。
您没有提供有关图像实际大小的任何信息,因此无法说出您可能达到的限制。但请记住,与单比例图像相比,三比例图像会将底层位图内存大小乘以 9。那是一个数量级!我完全相信,如果您尝试访问太大的图像,您会很快超出应用程序的内存容量,甚至会崩溃。所以第一步肯定是将图像加载为单比例图像;请参阅 ImageIO 框架以了解如何执行此操作。如果您想知道如何显示非常大的图像,另请参阅 CATiledLayer 上的文档。
对于有类似问题的人,也许尝试在真实设备上进行测试。对我来说,尺寸为 1000 x 7000 的图像不会显示在 Simulator 或 Interface Builder 中,但可以在 iPhone 6s plus 中显示。
此外,如果图像尺寸大于 10000 x 10000,Interface Builder 会报错。