在UIImagePickerController中隐藏快门

时间:2010-01-06 02:25:44

标签: iphone objective-c cocoa-touch uikit

我在iPhone应用程序中为相机视图设计了一个虹膜快门动画。

不幸的是,即使我隐藏相机控件并创建自定义cameraOverlayView,也无法在视图出现时隐藏Apple的快门。

通过使用UIImagePickerController的viewWillAppear和viewDidAppear方法,在视图出现时,通过在正常快门顶部设置快门动画来解决这个问题。但是,我第一次无法将快门隐藏在我的快门下。当应用程序启动时,它会显示摄像机视图,并且可以看到原始快门。在cameraController的所有后续视图中,我的解决方法都有效。有什么建议吗?

这是我的代码。这是来自我的应用代表:

- (void)applicationDidFinishLaunching:(UIApplication *)application {   

  cameraController = [[CameraController alloc] initWithMode:@"camera"];
  [window addSubview:cameraController.view];

}

这是来自我的UIImagePickerController子类:

- (void) viewWillAppear:(BOOL)animated {

  if (self.sourceType != UIImagePickerControllerSourceTypePhotoLibrary || simulatorView) {
    [self addShutter];
    [shutter close];
  }   
  [super viewWillAppear:animated];

}


- (void) viewDidAppear:(BOOL)animated {

  if (self.sourceType != UIImagePickerControllerSourceTypePhotoLibrary || simulatorView) {
    [shutter openShutter:.5f];
  }
  [super viewDidAppear:animated];

}

3 个答案:

答案 0 :(得分:2)

请注意,文档说不支持子类化UIImagePickerController,因此它可能在某些情况下有效但不“安全”。不确定它是否会被应用商店拒绝。 (可能取决于他们的静态代码验证工具有多挑剔。)

我真的没有一个好的答案,但是您可以尝试1)迭代选择器主视图的子视图,看看是否可以识别用于为快门设置动画的任何内容,然后将其修改以便它将不显示,或2)对于初始动画,只需在另一个不透明的黑色视图下显示初始图像选择器主视图。不确定用户指定的覆盖视图是否适用于该视图,但您可以在没有子类化的情况下执行这些操作。

搜索未记录的子视图是理论上不安全的另一件事,因为谁知道将来如何改变实现。

答案 1 :(得分:0)

可能为时已晚,但我的建议是使用以下通知(在调试时找到)

  1. PLCameraControllerAvailable - 已启动摄像机控制器对象,但尚未显示快门
  2. PLCameraViewIrisAnimationDidEndNotification - 虹膜动画完成。
  3. 用法很简单:在第一次通知时调用UIGetScreenImage(),在UIImagePicker上方的屏幕(全屏)上渲染抓取的图像。在第二次通知中销毁渲染图像。

答案 2 :(得分:0)

我尝试同样的事情没有结果,所以我做了解决方法:

1-假设你有一个名为showAllButtons的方法,没有参数可以显示你所有的自定义内容(按钮,工具栏......) 2-初始化隐藏的所有自定义控件 3-编写一个方法,在一个区间内调用最后一个函数:

-(void)showAllButtonsDelayed:(NSTimeInterval)a_iMsToDelay
{
    NSTimer* tmpShowButtonsTimer = [NSTimer timerWithTimeInterval:a_iMsToDelay target:self selector:@selector(showAllButtons) userInfo:nil repeats:NO];
    [[NSRunLoop currentRunLoop] addTimer:tmpShowButtonsTimer forMode:NSDefaultRunLoopMode];
}

4-在UIImagePickerController子类的willDidAppear方法中调用该方法。使用a_iMsToDelay的某些值进行播放。

希望这有帮助。