从照片库中选择一个项目(Picking an Item from the Photo Library)

来源:互联网 发布:owncloud源码分析 编辑:程序博客网 时间:2024/05/22 09:03

处理使用UIImagePickerController 实例来捕获新图片和影片,还可以用它来呈现媒体浏览,让用户从保存的相册中选择一个项目。采取的步骤类似于捕获媒体,在拍照和拍影片中有描述,两者的区别:
不是使用相机作为媒体来源,而是使用相册或保存照片或者整个照片库。
不是捕获一个新媒体然后保存到相册,而是让用户选择以前保存的媒体。可以选择应用中的媒体,然后全屏显示。
本章解释了如何使用一个图像选择控制器和代理来浏览和选择已保存的图片和影片。如果标准媒体浏览界面不适合需要,可以创建一个完全自定义的UIKit 和资源库框架解决方案。可查阅资源库框架引用。

创建和配置一个媒体浏览

大多数iOS设备有一个图片库。这样的设备,无论是否有相机,你可以使用图像选择控制器来呈现媒体浏览。至于呈现相机界面,必须在浏览界面实现委托对象响应用户交互。可以通过指定以下选项,实例化和配置一个图像选择控制器。
  • 源类型
为了配置选择器浏览保存的媒体而不是捕获新照片或电影,设置其源类型属性为其中一种来源:
使用UIImagePickerControllerSourceTypePhotoLibrary 来呈现浏览器,该浏览器可访问所有设备上的相册,包括有相机设备上的相册。
使用UIImagePickerControllerSourceTypeSavedPhotosAlbum 来呈现浏览器,该浏览器可访问有相机设备上的相册或者没有相机设备上的图片库。
注意:相机选择器总是调用UIImagePickerController 类的isSourceTypeAvailable:类方法并遵循它的返回值。不会假设设备有一个照片库。即使设备有照片库,如果照片库不可用,这个方法会返回NO。
  • 媒体类型
为了指定用户是否可以采取静态图像、电影或两者,可设置mediaTypes 属性到一个数组,该数组包含需要类型的标识符。数组元素的有效值是kUTTypeImage 和kUTTypeMovie。
然而,在设置这个属性之前,通过调用availableMediaTypesForSourceType: 类方法检查媒体类型是否可用。如果将媒体属性设为空数组,或者数组中没有可用的媒体类型用于当前资源,系统会抛出异常。
  • 编辑控件
为了指定相机界面是否应该提供给用户移动和调整捕获的图片或者修整捕获的影片,可以设置属性为YES(提供编辑控件)或者NO。
使用内置的编辑控件时,图像选择控制器将执行某些选项。对于静态图像,选择器会以最大像素尺寸裁剪为正方形。对于电影,选择器会执行最大电影长度和分辨率。如果希望让用户编辑全尺寸媒体或指定自定义裁剪,则必须提供自己的编辑界面。
  • 委托对象
最后,将委托对象分配给图像选择控制器的委托属性。
通过方法签名和条件测试,清单1验证了先决条件得到满足,继而实例化、配置和异步全屏显示相机的用户界面。

清单1展示了iPhone或iPod touch上全屏显示媒体浏览界面。

- (BOOL) startMediaBrowserFromViewController: (UIViewController*) controller               usingDelegate: (id <UIImagePickerControllerDelegate,                                   UINavigationControllerDelegate>) delegate {     if (([UIImagePickerController isSourceTypeAvailable:                 UIImagePickerControllerSourceTypeSavedPhotosAlbum] == NO)            || (delegate == nil)            || (controller == nil))        return NO;     UIImagePickerController *mediaUI = [[UIImagePickerController alloc] init];    mediaUI.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;     // Displays saved pictures and movies, if both are available, from the    // Camera Roll album.    mediaUI.mediaTypes =        [UIImagePickerController availableMediaTypesForSourceType:            UIImagePickerControllerSourceTypeSavedPhotosAlbum];     // Hides the controls for moving & scaling pictures, or for    // trimming movies. To instead show the controls, use YES.    mediaUI.allowsEditing = NO;     mediaUI.delegate = delegate;     [controller presentModalViewController: mediaUI animated: YES];    return YES;}

在iPad上,必须使用popover来展示浏览界面,在UIPopoverController Class Reference的initWithContentViewController: 和Presenting and Dismissing the Popover中有描述。在iPad上,如果视图全屏展示浏览界面,系统会抛出异常。
如果在设备上可以使用静态图像和电影,清单1中提供了一个选择器,让用户获取两者。呈现一个只能捕获影片的选择器,例如,确保影片捕获可用,然后如下设置媒体类型属性:
mediaUI.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeMovie, nil];
要使用这个选项,必须确保设备能够显示影片。通过调用availableMediaTypesForSourceType: 类方法。对于只捕捉静态图像的选择器,用kUTTypeImage替换这里的kUTTypeMovie 标识符或者依靠媒体类型属性的默认值,即kUTTypeImage。
清单1中startCameraControllerFromViewController:usingDelegate: 示例方法旨在通过如下动作方法来调用:
- (IBAction) showSavedMediaBrowser {    [self startMediaBrowserFromViewController: self                                    usingDelegate: self];}
注意,由于清单1中指定的方法签名,委托对象必须符合UIImagePickerControllerDelegate 和UINavigationControllerDelegateprotocols。
注意:如果没有指定委托符合UINavigationControllerDelegate 协议,在编译过程中可能会看到一个警告。然而,因为该协议的方法是可选的,警告没有关联运行时。为了消除警告,委托类支持的协议列表包含UINavigationControllerDelegate 协议。

为媒体浏览实现委托

当用标准媒体浏览器显示图像选择控制器,用户看到一个滚动的缩略图grid,这代表相册里边的内容。用户可以选择取消操作或点击缩略图。如果用户选择取消,委托实现必须隐藏选择器,就像在相机界面显示选择器一样。事实上,图像选择器的实现是相同的,无论是在浏览界面显示相机或媒体。参见清单2.
如果用户点击缩略图,下一步将发生什么取决于缩略图代表静态图片还是影片。
对于静态图片,点击缩略图会立即调用图片信息的委托。
对于影片,点击缩略图会显示一个预览,带有滚动条和三个按钮:播放,取消和选择。如果用户点击选择,系统会调用电影信息的委托。如果用户点取消,预览会自动消失并返回到媒体浏览。
为了响应用户在媒体浏览器中选择的图像选择控制器,使用的代码类似于清单所示。
清单2 选中媒体的委托方法
- (void) imagePickerController: (UIImagePickerController *) picker            didFinishPickingMediaWithInfo: (NSDictionary *) info {     NSString *mediaType = [info objectForKey: UIImagePickerControllerMediaType];    UIImage *originalImage, *editedImage, *imageToUse;     // Handle a still image picked from a photo album    if (CFStringCompare ((CFStringRef) mediaType, kUTTypeImage, 0)            == kCFCompareEqualTo) {         editedImage = (UIImage *) [info objectForKey:                    UIImagePickerControllerEditedImage];        originalImage = (UIImage *) [info objectForKey:                    UIImagePickerControllerOriginalImage];         if (editedImage) {            imageToUse = editedImage;        } else {            imageToUse = originalImage;        }        // Do something with imageToUse    }     // Handle a movied picked from a photo album    if (CFStringCompare ((CFStringRef) mediaType, kUTTypeMovie, 0)            == kCFCompareEqualTo) {         NSString *moviePath = [[info objectForKey:                    UIImagePickerControllerMediaURL] path];         // Do something with the picked movie available at moviePath    }     [[picker parentViewController] dismissModalViewControllerAnimated: YES];    [picker release];}
如果用户可以编辑图像并且用户成功的捕获到新图片,则imagePickerController:didFinishPickingMediaWithInfo: 方法的info参数包含一个字典,且该字典包含可编辑图像。如清单2中,将这张图像作为选择的图像。如果想存储原始图像,可以从字典中获得,如代码清单中所示。


官方原文:
https://developer.apple.com/library/ios/documentation/AudioVideo/Conceptual/CameraAndPhotoLib_TopicsForIOS/Articles/PickinganItemfromthePhotoLibrary.html#//apple_ref/doc/uid/TP40010408-SW1

0 0
原创粉丝点击