从目录加载 UIImage 不再起作用

Posted

技术标签:

【中文标题】从目录加载 UIImage 不再起作用【英文标题】:Loading UIImage from Directory no longer working 【发布时间】:2014-10-13 10:35:31 【问题描述】:

在过去的 5 或 6 个月里,我一直将图像保存到我在用户设备上的文档目录中创建的照片文件夹中。然后,当用户进入特定屏幕时,照片将被加载到 imageView 中,直到最近这一直运行良好。

现在图像不再显示在图像视图中,并且当使用 URL 打印出图像的宽度和高度时,即使 URL 没有更改,值也为零。

我正在使用以下代码在图像视图中显示图像。

outputImageView = [[UIImageView alloc] init];

    [outputImageView setFrame:originalImageViewSize];

    outputImageView.image = [UIImage imageWithData:[NSData dataWithContentsOfFile:photoURL]];

    NSLog(@"width %f, height %f", outputImageView.image.size.width, outputImageView.image.size.height);

photoURL 如下:/Users/fernandosantos/Library/Developer/CoreSimulator/Devices/6F3FCE2A-F7F9-4F77-B66D-3DA2A25BE166/data/Containers/Data/Application/C3867EFA-6AA8-4B71-A856-DCF7F83DEFF0/文件/AUDIBURY/照片/COMMTRCIAL-CSRSignature--2014-10-13 10-49-16.jpg

谢谢

【问题讨论】:

我猜[NSData dataWithContentsOfFile:photoURL] 返回零。您是否特别看到了 ios 8 的这个问题?如果是这样.. 您需要向我们展示您是如何获得photoURL 的。在 iOS 8 中,沙盒的目录结构发生了变化,如果您没有使用正确的 API 来获取文件路径,那么 photoURL 将不正确。有关 iOS 8 更改的更多信息,请在此处查看我的回答:***.com/a/25885321/814389 我从 coreData 收到 photoURL,如下所示:AnswerSignature *signature = [results objectAtIndex:0]; photoURL = 签名.signatureURL; 首先去检查一下iPhone Simulator文件夹,看看里面有没有这个文件。 【参考方案1】:

在 iOS8 中,应用程序文档目录会在每次运行时动态更改其名称。您必须使用 Appdelegate 中的以下方法才能获取当前文档目录路径:

// Returns the URL to the application's Documents directory.
- (NSURL *)applicationDocumentsDirectory

    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];

您应该只保存文件的相对路径,而不是完整路径。此方法也适用于 iOS7。

您可以使用 iOS 模拟器并检查完整路径实际上不存在。

【讨论】:

好的,我已经确保通过使用上述方法获取当前文档目录,并将我的自定义文件夹与图像名称一起创建。图像仍未加载到图像视图中,但图像在 iPhone 模拟器目录中。 所以我当前的 photoURL 如下:file:///Users/fernandosantos/Library/Developer/CoreSimulator/Devices/3B3123A9-724B-45D4-8705-0ABC9E87A589/data/Containers/Data/Application /EE56A436-7C72-4B0B-A9BA-940BD211ED8E/Documents/AUDIBURY/Photos/COMMTRCIAL - CSRSignature--2014-10-13 13-19-15.jpg 我不确定,但您可能需要用 stringByReplacingOccurrencesOfString:@" " withString:@"%20" 替换那些空格 " " 和 "%20",我不确定但你可以试试。此外,如果可以的话,我会在真实设备上尝试 如果您使用的是模拟器,您可以通过终端访问该路径以检查该路径是否确实存在 感谢您的帮助,我设法解决了我的问题。我稍后会在我有时间的时候上传一个答案。使用上述方法会为您提供以“file://”开头的照片的 url,这将不起作用。【参考方案2】:

感谢所有回复建议的人。

我结合了大家的建议,想出了适合我的解决方案。

//get the documents directory, in iOS 8 this is now dynamic everytime you run the app.

 NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

//Create the CurrentPhotoURL by using the current documents directory and the appending the photo name which
//was created when saving the image originally.
NSString *currentPhotoURL = [[documentsDirectory stringByAppendingString:@"/"] stringByAppendingString:photoName];

由于我在名为 Photos 的文档目录中创建了一个新文件夹,因此 photoName 变量保存了 Photos 文件夹的名称,后跟图像最初保存时的名称。

然后我将 photoName 变量附加到当前文档目录以获取该照片的完整目录路径。

这可能不是最好的解决方案,但它是我想出的并且它有效。

如果其他人需要更多信息,请与我联系。

【讨论】:

以上是关于从目录加载 UIImage 不再起作用的主要内容,如果未能解决你的问题,请参考以下文章

您可以从 PDF 数据创建 UIImage 吗?

用于截取整个 UITableView 的代码在 iOS 13 中不再起作用

从 Parse.com 将徽标图像加载到 UIImage

UIImageView 中的 UIImage 位置偏移

如何将 UIImage 异步加载到 SwiftUI Image 中?

从文件加载的 UIImage 部分是黑色的