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

处理使用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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的码资涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些码资特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资都能为你提供宝贵的学习和实践机会。通过学习和运行这些码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些码资进行课程实践、课外项目或毕业设计。通过分析和运行码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保码资的可运行性和易用性,特别注意了以下几点:首先,每份码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些码资,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值