iPhone UIImagePickerController问题:想要在点击“使用”按钮后显示UIActivityIndi​​catorView

时间:2009-08-19 18:55:23

标签: iphone android-activity uiimagepickercontroller progress

当Apple推出iPhone OS 3.0版本时,UIImagePickerController略有改变:在用户确认最近拍摄的照片后,它不再提供活动或进度指示器。简而言之,你现在 - 拍照, - 决定没关系 - 点击“使用”按钮并等待。 没有迹象表明您是否实际点击了“使用”按钮。通常,我打了好几次,因为我不确定我是不是真的打了它。几秒钟后,您会看到图像或图像通过代理连接可用,例如

  • (void)imagePickerController:(UIImagePickerController *)选取器 didFinishPickingMediaWithInfo:(NSDictionary *)info

我的问题是: - 如何在选择“使用”按钮后立即显示UIActivityIndi​​catorView?或者,如何通过拦截“使用”按钮回调来插入我自己的代码?我在网上搜索并期望很多人遇到同样的问题,但还没有找到解决方案。

感谢。

3 个答案:

答案 0 :(得分:1)

不幸的是,你无法拦截这个电话。我这样说是因为UIImagePickerController中没有委托方法会告诉委托有关按下按钮的推送。既然你不能改变UIImagePickerController中的代码我不认为有任何东西可以做。 Apple用3.1修改了这个,我听说他们在UIImagePickerController上做了一些工作......

答案 1 :(得分:0)

你基本上可以做的是在解雇之前将你的UIActivityInidicati添加到UIImagePicker视图。

在用户按下使用按钮后压缩图像时,我正在做类似的事情。注意NSTimer - 这是让iphone真正显示你要添加的UI的一个很好的技巧: on didFinishPickingImage:

//this will add the UIActivityInidicatior to the picker view

(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo { 
 showActivity(@"Compressing Image", picker.view);

 //this is a hack so the progress label will show up

[NSTimer scheduledTimerWithTimeInterval: 0.0f
                                     target: self
                                   selector: @selector(compress:)
                                   userInfo: image
                                    repeats: NO];
}




//the Compress method

(void) compress:(NSTimer *)inTimer {
 NSAutoreleasePool *_pool = [[NSAutoreleasePool alloc] init];

 //do some work


   [[self getPicker] dismissModalViewControllerAnimated:YES]; 

//dismiss the view we added to the picker
 showActivity(nil, [self getPicker].view);

 [_pool release];

}

请注意,我将UIImagePickerController保留在外面,因此我可以从调用的消息中引用它。

showActivity是一个简单的方法,可以在给定视图中添加一些UI。

答案 2 :(得分:0)

通过调度队列概念,

当你按下使用按钮时,它将在一个线程中解除pickercontroller并显示活动指示符代码将在另一个线程中运行。在这两者之间,您可以调用自己的方法。

  

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,   0),^ {

dispatch_async(dispatch_get_main_queue(), ^{

  indicator=[[MBProgressHUD alloc]init];
  indicator.labelText=@"Loading";
  indicator = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];
  [indicator show:YES];


});

// Put here the code to resize the image
[self performSelectorInBackground:@selector(setPath:) withObject:image];

dispatch_async(dispatch_get_main_queue(), ^{
  [picker dismissModalViewControllerAnimated:YES];

});

如果要在uiimagepickercontroller中显示活动指示器,则意味着只需更改此行

  indicator=[[MBProgressHUD alloc]init];
  indicator.labelText=@"Loading";
  indicator = [MBProgressHUD showHUDAddedTo:picker.cameraOverlayView animated:YES];
  [indicator show:YES];