【问题标题】:Detecting when camera's iris is open on iPhone检测相机的光圈何时在 iPhone 上打开
【发布时间】:2009-10-15 05:17:09
【问题描述】:

对于自定义相机叠加层,我需要找出虹膜何时打开,因为我的叠加层将始终在虹膜关闭时显示(然后以动画方式打开)。

有什么想法吗?

【问题讨论】:

    标签: iphone camera


    【解决方案1】:

    您可以收听 PLCameraViewIrisAnimationDidEndNotification 通知。由于这没有正式记录,您可能违反了 Apple TOS,但我认为只要您编写代码,以便防范此通知的名称或合同可能发生变化的可能性(所以将来您可能不会得到事件)你可能会没事的。换句话说,使用计时器或其他技术来确保在虹膜打开时您想做的事情最终一定会发生,即使您从未收到通知......

    没有防御性编程的简单示例。 (当然,您也可以只注册此特定通知的兴趣,请参阅通知中心的文档。)

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(notificationCallback:)
                                                 name:nil
                                               object:nil
     ];
    
    - (void) notificationCallback:(NSNotification *) notification {
         if ([[notification name] isEqualToString:@"PLCameraViewIrisAnimationDidEndNotification"]) {
             NSLog(@"Iris open");
             // we don't need to listen any more
             [[NSNotificationCenter defaultCenter] removeObserver:self];
         }
    }
    

    【讨论】:

    • 我已经看到足够多的东西在 2.x 和 3.x 之间的无证相机 API 中停止工作,我不确定我是否会依赖无证调用。
    【解决方案2】:

    似乎 PLCameraViewIrisAnimationDidEndNotification 在 iOS5 中不再收到通知。

    当虹膜完全打开时,我不知道什么是合适的解决方案,必须有另一个选择,而不是使用 3 秒计时器。

    在这里查看:https://devforums.apple.com/message/561008#561008

    【讨论】:

      【解决方案3】:

      我有一个 ViewController (ALImagePickerController),它保存、初始化 UIImagePickerController 并将其呈现为子视图控制器(我有另一个子视图控制器用于呈现此处未显示的拍摄图像)并且我呈现(作为模态) ALImagePickerController 当我想使用相机时。因此,在此期间 ViewContoller 的 viewDidAppear 我添加了一个动画,以便在快门动画消失时优雅地引入相机叠加层。

      @interface ALImagePickerController ()
      
      @property (nonatomic) UIImagePickerController           *cameraController;
      @property (nonatomic) CameraOverlayView                 *overlayView;
      ....
      
      @end
      
      @implementation ALImagePickerController
      
      ....
      
      
      - (void)viewDidLoad {
          [super viewDidLoad];
      
          [UIApplication sharedApplication].statusBarHidden = YES;
      
          self.cameraController = [UIImagePickerController new];
          self.cameraController.sourceType = UIImagePickerControllerSourceTypeCamera;
          self.cameraController.delegate = self;
          self.cameraController.allowsEditing = NO;
          self.cameraController.showsCameraControls = NO;
          ....
      
          self.overlayView = [CameraOverlayView new];
          ....
          self.overlayView.alpha = 0;
          self.cameraController.cameraOverlayView = self.overlayView;
      
          .... 
      
           // add as child view controller
          [self addChildViewController:self.cameraController];
          [self.view addSubview:self.cameraController.view];
          [self.cameraController didMoveToParentViewController:self];
      }
      
      
      - (void)viewWillDisappear:(BOOL)animated {
          [super viewWillDisappear:animated];
          [UIApplication sharedApplication].statusBarHidden = NO;
      }
      
      
      - (void)viewDidAppear:(BOOL)animated {
          [super viewDidAppear:animated];
      
          // smoothly bring in the overlay as the native camera shutter animation opens.
          [UIView animateWithDuration:0.2 delay:0.3 options:UIViewAnimationCurveEaseOut animations:^{
              self.overlayView.alpha = 1.f;
          } completion:nil];
      }
      
      ....
      
      @end
      

      【讨论】:

        【解决方案4】:

        我解决这个问题的方法是初始化所有元素,并将 hidden 属性设置为 YES,然后在调用相机后调用 3 秒延迟选择器,将所有元素设置为 hidden = NO。这不是一个理想的解决方案,但它似乎可以工作,并且打开虹膜后的任何延迟都可以忽略不计。

        【讨论】:

          【解决方案5】:

          您应该已经知道相机何时可以拍照。至少我使用自定义相机叠加层的方式是,我使用self.sourceType = UIImagePickerControllerSourceTypeCamera; 和其他常用设置来初始化视图,此时相机已准备就绪(或“光圈已打开”)。

          总而言之,如果有人按照我习惯的方式使用自定义的相机叠加层,那么就会知道虹膜何时打开,因为它在您的控制之下。

          【讨论】:

          • 这不是在回答他的问题。他的问题是他的叠加层在虹膜动画中是可见的,并且他只想在动画完成后在叠加层上显示一些不同的东西。您无法控制 iPhone 需要多长时间才能呈现相机控制器并打开光圈;您只知道何时要求视图控制器启动该过程。
          • 尽我所能地回答它。 :-) 我的叠加层正是这样做的:仅在动画完成后才显示。事实上,现在查看我手机上的调试版本,有一个短暂的(如果我没有一直在寻找它,几乎无法检测到)旧覆盖显示在动画之后和修改后的覆盖显示之前的时刻。叠加层永远不会显示在动画顶部。如果 OP 想要跟进并确认这是所需的行为,我可以挖掘代码并发布我正在使用的序列。
          • 不管提问者是谁,我都对你的代码感兴趣。 :-) 您似乎暗示您有两个叠加层,但是您在哪里/何时从一个覆盖到另一个?我的另一个问题是您的 self.sourceType 行,这意味着您正在对选择器进行子类化,但也许这只是您答案中的简写?我看到和使用的代码遵循这个主题:a)创建自定义视图 b)创建选择器 c)添加视图作为选择器的覆盖 d)设置选择器的 sourceType e)呈现选择器当你这样做即,您会看到虹膜在您的自定义视图上打开。
          猜你喜欢
          • 2012-03-14
          • 2011-08-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-09
          相关资源
          最近更新 更多