繁体   English   中英

在UIImagePickerController中隐藏快门

[英]Hide Shutter in UIImagePickerController

我已经为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];

}

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

我的回答不是很好,但是您可以尝试以下两种方法之一:在选择器主视图的子视图上进行迭代,以查看是否可以识别出用于动画快门的内容,然后对其进行处理以使其不会显示,或2)对于初始动画,只需在另一个不透明的黑色视图下显示初始图像选择器主视图即可。 不知道用户指定的重叠视图是否可以使用,但是您可以在不进行子类化的情况下进行操作。

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

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

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

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

我尝试同样的事情但没有结果,所以我执行以下解决方法:

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

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM