iOS - UIImageWriteToSavedPhotosAlbum

时间:2011-10-02 17:37:37

标签: ios

我想使用以下的void API将捕获的图像写入相册,但我不太清楚其中的两个参数

UIImageWriteToSavedPhotosAlbum (
   UIImage  *image,
   id       completionTarget,
   SEL      completionSelector,
   void     *contextInfo
);

来自ADC的解释:

completionTarget:可选;在将图像写入相机胶卷相册后应调用其选择器的对象。

completionSelector: completionTarget对象的方法选择器。此可选方法应符合以下签名:

- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo: (void *) contextInfo;

completionTarget在这里有什么意义?有人可以用一个例子来解释如何使用这个参数吗?或任何可以指导我完成它的资源。

3 个答案:

答案 0 :(得分:109)

  • completionSelector是图像写入完成时要调用的选择器(方法)。
  • completionTarget是调用此方法的对象。

一般而言:

  • 在完成图像写入时(在许多情况下没有用),您不需要得到通知,因此您对{2}使用nil
  • 或者您确实希望在将图像文件写入相册时收到通知(或最终出现写入错误),在这种情况下,您通常会实现回调(=完成时调用的方法)在您调用UIImageWriteToSavedPhotosAlbum函数的同一个类中,因此completionTarget通常为self

正如文档所述,completionSelector是一个选择器,表示带有文档中描述的签名的方法,因此它必须具有如下签名:

- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo: (void *) contextInfo;

它不必具有这个确切的名称,但它必须使用相同的签名,即取3个参数(第一个是UIImage,第二个是NSError,第三个是void*类型)并且不返回任何内容(void)。


实施例

例如,您可以声明并实现一个可以调用此方法的方法:

- (void)thisImage:(UIImage *)image hasBeenSavedInPhotoAlbumWithError:(NSError *)error usingContextInfo:(void*)ctxInfo {
    if (error) {
        // Do anything needed to handle the error or display it to the user
    } else {
        // .... do anything you want here to handle
        // .... when the image has been saved in the photo album
    }
}

当你致电UIImageWriteToSavedPhotosAlbum时,你会像这样使用它:

UIImageWriteToSavedPhotosAlbum(theImage,
   self, // send the message to 'self' when calling the callback
   @selector(thisImage:hasBeenSavedInPhotoAlbumWithError:usingContextInfo:), // the selector to tell the method to call on completion
   NULL); // you generally won't need a contextInfo here

注意 @selector(...)语法中的多个':'。冒号是方法名称的一部分,所以当你写这行时,不要忘记在@selector 中添加这些':'(在训练的情况下)!

答案 1 :(得分:-1)

基于AliSoftware解决方案的SWIFT版本

UIImageWriteToSavedPhotosAlbum(
    yourImage,
    self, // send the message to 'self' when calling the callback
    #selector(image(path:didFinishSavingWithError:contextInfo:)), // the selector to tell the method to call on completion
    nil // you generally won't need a contextInfo here
)

@objc private func image(path: String, didFinishSavingWithError error: NSError?, contextInfo: UnsafeMutableRawPointer?) {
    if ((error) != nil) {
        // Do anything needed to handle the error or display it to the user
    } else {
        // .... do anything you want here to handle
        // .... when the image has been saved in the photo album
    }
}

答案 2 :(得分:-1)

在现代iOS和Swift中调用UIImageWriteToSavedPhotosAlbum

在现代iOS中,还需要使用UIImageWriteToSavedPhotosAlbum。您必须在您的 Info.plist 中包含一个密钥NSPhotoLibraryAddUsageDescription(“隐私-图片库添加用法说明”)。这样一来,系统就可以向用户显示一个对话框,请求允许其写入相机胶卷。

然后您可以在代码中调用UIImageWriteToSavedPhotosAlbum:

func myFunc() {
    let im = UIImage(named:"smiley.jpg")!
    UIImageWriteToSavedPhotosAlbum(im, self, #selector(savedImage), nil)
}

最后一个参数,即上下文,通常为nil

后两个参数self#selector(savedImage)的想法是,savedImage中的self方法将在图像保存后被调用(或不保存)。保存)。该方法应如下所示:

@objc func savedImage(_ im:UIImage, error:Error?, context:UnsafeMutableRawPointer?) {
    if let err = error {
        print(err)
        return
    }
    print("success")
}


典型的错误是用户在系统对话框中拒绝许可。如果一切顺利,错误将为nil,您将知道写入成功。

通常,应避免使用UIImageWriteToSavedPhotosAlbum,而应使用Photos框架。但是,这是完成工作的简单方法。