对于自定义相机叠加,我需要找到,当光圈打开时,因为我的叠加将始终显示在光圈关闭(然后动画打开)。
有什么想法吗?
答案 0 :(得分:3)
您可以侦听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];
}
}
答案 1 :(得分:3)
似乎PLCameraViewIrisAnimationDidEndNotification不再在iOS5中得到通知。
当虹膜打开时,我无法弄清楚什么是合适的解决方案,必须有另一种选择,而不是使用3秒计时器。
答案 2 :(得分:2)
我有一个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
答案 3 :(得分:0)
我解决这个问题的方法是初始化所有隐藏属性设置为YES的元素,然后在调用相机后调用3秒延迟选择器,我将所有元素设置为hidden = NO。它不是一个理想的解决方案,但似乎有效,虹膜打开后的任何延迟都可以忽略不计。
答案 4 :(得分:-1)
您应该已经知道相机何时准备拍照。至少我使用自定义相机覆盖的方式,我用self.sourceType = UIImagePickerControllerSourceTypeCamera;
和其他常用设置启动视图,然后相机就绪(或“虹膜打开”)。
总之,如果我按照习惯使用自定义相机覆盖方式,人们就会知道虹膜何时打开,因为它在您的控制之下。