Ios 将completionSelector和completionTarget与UIImageWriteToSavedPhotosAlbum一起使用
我正试图找到一种方法,让我的iOS应用程序将屏幕截图保存到摄像机上,然后弹出一个警报,告诉用户屏幕截图已成功保存 我能想到的唯一方法是使用某种形式的if/else循环(您将在下面的伪代码注释中看到),但我想不出任何语法来使用UIKit中的Ios 将completionSelector和completionTarget与UIImageWriteToSavedPhotosAlbum一起使用,ios,swift,uiimage,screenshot,alert,Ios,Swift,Uiimage,Screenshot,Alert,我正试图找到一种方法,让我的iOS应用程序将屏幕截图保存到摄像机上,然后弹出一个警报,告诉用户屏幕截图已成功保存 我能想到的唯一方法是使用某种形式的if/else循环(您将在下面的伪代码注释中看到),但我想不出任何语法来使用UIKit中的UIImageWriteToSavedPhotosAlbum函数。我曾在苹果的开发网站上遇到过使用completionSelector和completionTarget的建议,但我真的不知道如何使用它们,也不知道我的代码中的completionSelector和
UIImageWriteToSavedPhotosAlbum
函数。我曾在苹果的开发网站上遇到过使用completionSelector和completionTarget的建议,但我真的不知道如何使用它们,也不知道我的代码中的completionSelector和completionTarget应该使用什么特定的措辞。我对斯威夫特比较陌生
有人能解释一下它们是如何工作的,以及我如何在代码中找到使用它们的语法吗
func screenshotMethod()
{
UIGraphicsBeginImageContextWithOptions(HighchartsView.scrollView.contentSize, false, 0);
view.layer.renderInContext(UIGraphicsGetCurrentContext())
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
//if saved to Camera Roll
// {
// confirmScreenshot()
// }
//
//else
// {
// exit code/stop
// }
}
func confirmScreenshot()
{
let alertController = UIAlertController(title: "Success", message: "This chart has been successfully saved to your Camera Roll.", preferredStyle: .Alert)
let defaultAction = UIAlertAction(title: "OK", style: .Default, handler: nil)
alertController.addAction(defaultAction)
presentViewController(alertController, animated: true, completion: nil)
}
导入UIKit
类ViewController:UIViewController{
@按下iAction func按钮(发件人:AnyObject){
presentImagePickerController()
}
}
扩展视图控制器:UIImagePickerControllerDelegate、UINavigationControllerDelegate{
func presentImagePickerController(){
让imagePickerController=UIImagePickerController()
imagePickerController.delegate=self
imagePickerController.sourceType=.PhotoLibrary
imagePickerController.allowsEditing=false
presentViewController(imagePickerController,动画:true,完成:nil)
}
func imagePickerController(picker:UIImagePickerController,didFinishPickingImage:UIImage,editingInfo:[字符串:任意对象]?){
UIImageWriteToSavedPhotosAlbum(图像,自我,“图像:didFinishSavingWitheror:contextInfo:”,无)
}
func ImagePickerController IDCancel(选择器:UIImagePickerController){
self.dismissViewControllerAnimated(真,完成:无)
}
func图像(图像:UIImage,DidFinishSavingWither错误:NSError?,上下文信息:UnsafePointer){
保护错误==nil else{
//保存图像时出错
返回
}
//已成功保存图像
}
}
@Dare检查错误的解决方案对我不起作用(Swift 2.0)
这一微小的修改确实起了作用:
func image(image: UIImage, didFinishSavingWithError: NSError?, contextInfo:UnsafePointer<Void>) {
if didFinishSavingWithError != nil
{
Helper.showNotifierInfo(DefaultTextFailed)
}
else
{
Helper.showNotifierInfo(DefaultTextSaved)
}
}
func图像(图像:UIImage,didFinishSavingWither错误:NSError?,上下文信息:UnsafePointer){
如果没有完成,则savingwitherror!=零
{
Helper.showNotifierInfo(DefaultTextFailed)
}
其他的
{
Helper.showNotifierInfo(DefaultTextSaved)
}
}
swift 2.2中的另一个示例
本例中的关键区别在于,具有回调函数的类必须从NSObject扩展而来(@objc也可以工作)
func writeImage(){
let responder=WriteImageToFileResponder()
响应程序.addCompletion{print(“completed”)}
让image=UIImage(颜色:.redColor(),大小:CGSize(宽度:100,高度:100))!
UIImageWriteToSavedPhotosAlbum(图像,响应程序,#选择器(WriteImageToFileResponder.image(uu∶didFinishSavingWithError:contextInfo:)),无)
}
类WriteImageToFileResponder:NSObject{
var完成:(()->无效)?
func图像(图像:UIImage,DidFinishSavingWither错误:NSError?,上下文信息:UnsameutablePointer){
打印(错误)
完成?()
}
func addCompletion(完成:(()->Void)?){
自我完成=完成
}
}
以下是一个工作示例,用于在SWIFT 3.0中,将当前视图的屏幕截图保存在camera roll中
@IBAction func saveScreenshot(_ sender: Any) {
//Create the UIImage
UIGraphicsBeginImageContextWithOptions(editorView.frame.size, false, UIScreen.main.scale)
// UIGraphicsBeginImageContext(myTextView.frame.size)
editorView.layer.render(in: UIGraphicsGetCurrentContext()!)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
UIImageWriteToSavedPhotosAlbum(image!, self, #selector(TextEditorViewController.image(_:didFinishSavingWithError:contextInfo:)), nil)
}
func image(_ image: UIImage, didFinishSavingWithError error: NSError?, contextInfo: UnsafeRawPointer) {
if let error = error {
// we got back an error!
let ac = UIAlertController(title: "Save error", message: error.localizedDescription, preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "OK", style: .default))
present(ac, animated: true)
} else {
let ac = UIAlertController(title: "Saved!", message: "Your image has been saved to your photos.", preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "OK", style: .default))
present(ac, animated: true)
}
}您有没有可能知道如何将其更新为Swift 2.1?如果contextInfo对象不是零,则更新为Swift 2.1非常好,以了解其如何被分解。我还无法将其应用于我的任何想法?UIImageWriteToSavedPhotosAlbum(imageToSave,#选择器(PreviewViewController.image(:didFinishSavingWithError:contextInfo:)),nil,nil)`并定义为`@objc func image(image:UIImage,didFinishSavingWithError错误:NSError?,contextInfo:UnsafePointer)`
func writeImage(){
let responder = WriteImageToFileResponder()
responder.addCompletion{ print("completed") }
let image = UIImage(color: .redColor(), size: CGSize(width: 100, height: 100))!
UIImageWriteToSavedPhotosAlbum(image, responder, #selector(WriteImageToFileResponder.image(_:didFinishSavingWithError:contextInfo:)), nil)
}
class WriteImageToFileResponder: NSObject {
var completion: (() -> Void)?
func image(image: UIImage, didFinishSavingWithError error: NSError?, contextInfo: UnsafeMutablePointer<Void>) {
print(error)
completion?()
}
func addCompletion(completion: (() -> Void)? ) {
self.completion = completion
}
}
@IBAction func saveScreenshot(_ sender: Any) {
//Create the UIImage
UIGraphicsBeginImageContextWithOptions(editorView.frame.size, false, UIScreen.main.scale)
// UIGraphicsBeginImageContext(myTextView.frame.size)
editorView.layer.render(in: UIGraphicsGetCurrentContext()!)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
UIImageWriteToSavedPhotosAlbum(image!, self, #selector(TextEditorViewController.image(_:didFinishSavingWithError:contextInfo:)), nil)
}
func image(_ image: UIImage, didFinishSavingWithError error: NSError?, contextInfo: UnsafeRawPointer) {
if let error = error {
// we got back an error!
let ac = UIAlertController(title: "Save error", message: error.localizedDescription, preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "OK", style: .default))
present(ac, animated: true)
} else {
let ac = UIAlertController(title: "Saved!", message: "Your image has been saved to your photos.", preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "OK", style: .default))
present(ac, animated: true)
}