1

我正在开发一个相机应用程序,无论我使用我的应用程序拍摄的照片,这些照片都应该存储在一个私人应用程序目录中。

如果我单击第一个视图中的按钮,它应该转到显示从我的私有应用程序目录检索到的图像的第二个视图。

我应该能够在第二个视图中选择其中一些图像,如果我单击下一步按钮,所选图像应该显示在第三个视图中。

那么,首先,如何创建一个私有目录以及如何从该目录中检索图像

以及如何选择图像并将它们发送到下一个视图?

另外,我应该能够在第三个视图中更改这些选定图像的顺序

只需拖动它们。如何做到这一点?

4

1 回答 1

1

首先,

如果您正在考虑创建一个用于存储图像并在其他应用程序中使用图像的应用程序,那么您选择了错误的路径。苹果不会允许你这样做。

您可以做的是将图像存储在应用程序提供的目录中。

对于目录,您可以遵循以下目录:


需要考虑三种可写路径 - 第一种是 Documents,您可以在其中存储要保留的内容并通过 iTunes 提供给用户(从 3.2 开始):

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

其次,与 Documents 目录非常相似,有 Library 文件夹,您可以在其中存储配置文件和您也想保留的可写数据库,但您不希望用户能够通过 iTunes 搞乱:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *libraryDirectory = [paths objectAtIndex:0];

请注意,即使用户无法使用 3.2 之前的设备(iPad)查看 iTunes 中的文件,但 NSLibraryDirectory 常量自 iPhoneOS 2.0 起就可用,因此可用于面向 3.0 的构建(如果您仍在使用,则甚至更早)那)。此外,除非您将应用程序标记为允许用户修改文档,否则用户将无法看到任何内容,因此,如果您今天使用 Documents,只要您在更新时更改位置以支持用户文档,就可以了。

最后有一个缓存目录,您可以在其中放置您不关心的图像是否长期存在(手机可能会在某个时候删除它们):

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachePath = [paths objectAtIndex:0];
BOOL isDir = NO;
NSError *error;
if (! [[NSFileManager defaultManager] fileExistsAtPath:cachePath isDirectory:&isDir] && isDir == NO) {
    [[NSFileManager defaultManager] createDirectoryAtPath:cachePath withIntermediateDirectories:NO attributes:nil error:&error];
}

请注意,您必须在那里实际创建 Caches 目录,因此在编写时您必须每次都检查并创建!有点痛,但就是这样。

然后,当您有一个可写路径时,您只需在其上附加一个文件名,如下所示:

NSString *filePath =  [documentsDirectory stringByAppendingPathComponent:@"SomeDirectory/SomeFile.txt"];

或者

NSString *filePath =  [cachePath stringByAppendingPathComponent:@"SomeTmpFile.png"];

使用该路径进行阅读或写作。

请注意,您可以在上述任一示例字符串使用的任一可写路径中创建子目录(假设已创建一个)。

如果您尝试将图像写入照片库,则不能使用文件系统调用来执行此操作 - 相反,您必须在内存中有一个 UIImage,并使用 UIKit 定义的 UIImageWriteToSavedPhotosAlbum() 函数调用。您无法控制目标格式或压缩级别,也不能以这种方式附加任何 EXIF。


我希望它可以帮助您满足您的需求并了解目录。

于 2012-10-25T10:06:56.723 回答