【问题标题】:Hide Shutter in UIImagePickerController在 UIImagePickerController 中隐藏快门
【发布时间】:2010-01-06 02:25:44
【问题描述】:

我为 iPhone 应用中的相机视图设计了光圈快门动画。

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

当视图出现时,我通过使用 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];

}

【问题讨论】:

  • 对此有何消息?已经有一段时间了,我看到 Instagram 有自定义快门。

标签: iphone objective-c cocoa-touch uikit


【解决方案1】:

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

我真的没有一个好的答案,但您可以尝试 1) 遍历选取器主视图的子视图,看看您是否可以识别用于为快门设置动画的任何内容,然后将其弄乱以使其不会显示,或者 2) 对于初始动画,仅在另一个不透明的黑色视图下显示初始图像选择器主视图。不确定用户指定的覆盖视图是否适用于此,但您也许可以在没有子类化的情况下执行这些操作。

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

【讨论】:

  • 我不认为文档在任何地方都这么说,而且我有多个带有 UIImagePickerController 子类的应用程序。 Apple 甚至提供了 .cameraOverlayView 来帮助你在 3.0 中做到这一点。
  • 文档确实说您不应该对其进行子类化:来自 UIImagePickerController 类参考:“重要提示:UIImagePickerController 类仅支持纵向模式。此类旨在按原样使用并且不支持子类化。此类的视图层次结构是私有的,不得修改,但有一个例外。在 iPhone OS 3.1 及更高版本中,您可以将自定义视图分配给 cameraOverlayView 属性并使用该视图来呈现附加信息或管理相机界面和您的代码之间的交互。”
  • 为什么有人投票反对我的答案?我对文档所说的内容是正确的。
【解决方案2】:

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

  1. PLCameraControllerAvailable - 相机控制器对象已启动,但快门尚不可见
  2. PLCameraViewIrisAnimationDidEndNotification - 虹膜动画完成。

而且用法很简单:在第一次通知时调用 UIGetScreenImage(),在 UIImagePicker 上方的屏幕(全屏)上渲染抓取的图像。在第二次通知时销毁渲染图像。

【讨论】:

  • 感谢您的回答,但我无法拨打私人电话。这是针对客户的应用程序 :)
  • 好吧。关于 UIGetScreenImage() 的情况 - Apple 已正式允许使用该未记录的功能:tuaw.com/2009/12/15/…
【解决方案3】:

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

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 的值。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 2014-11-14
    相关资源
    最近更新 更多