Для наложения камеры cutom мне нужно выяснить, когда диафрагма открыта, потому что мой оверлей всегда будет отображаться, пока диафрагма закрыта (а затем анимируется для открытия).
Любые идеи ?
Для наложения камеры cutom мне нужно выяснить, когда диафрагма открыта, потому что мой оверлей всегда будет отображаться, пока диафрагма закрыта (а затем анимируется для открытия).
Любые идеи ?
Вы можете прослушивать уведомление PLCameraViewIrisAnimationDidEndNotification. Поскольку это официально не задокументировано, возможно, вы нарушаете УО Apple, но я думаю, что до тех пор, пока вы пишете свой код, он защищает от возможности изменения названия или контракта этого уведомления (так что в будущем вы может не попасть на мероприятие) вы, вероятно, будете в порядке. Другими словами, используйте таймер или другую технику, чтобы гарантировать, что то, что вы хотите сделать, когда диафрагма открыта, обязательно произойдет в конечном итоге, даже если вы никогда не получите уведомление ...
Банальный пример без защитного программирования. (Конечно, вы также можете зарегистрировать интерес только для этого конкретного уведомления, см. Документацию для центра уведомлений.)
[[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];
}
}
Похоже, что PLCameraViewIrisAnimationDidEndNotification больше не получает уведомления в iOS5.
Я не могу понять, что является подходящим решением, когда диафрагма закончила открываться, должен быть другой вариант, а не использование 3-секундного таймера.
Проверьте здесь: https://devforums.apple.com/message/561008#561008
У меня есть ViewController (ALImagePickerController), который содержит, инициализирует и представляет UIImagePickerController в качестве контроллера дочернего представления (у меня есть еще один контроллер дочернего представления для представления снятого изображения, которое здесь не показано), и я представляю (как модальный) ALImagePickerController, когда я хочу использовать камеру. Поэтому во время этого viewDidAppear ViewContoller я добавляю анимацию, чтобы изящно добавить наложение камеры по мере исчезновения анимации затвора.
@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
Я решил эту проблему так: я инициализирую все элементы со свойством hidden, установленным на YES, а затем вызываю селектор с 3-секундной задержкой после вызова камеры, где я устанавливаю все элементы на hidden = NO. Это не идеальное решение, но похоже, что оно работает, и любое отставание после открытия диафрагмы незначительно.
Вы уже должны знать, когда камера готова сделать снимок. По крайней мере, так как я использую настраиваемый оверлей камеры, я инициирую просмотр с чем-то вроде self.sourceType = UIImagePickerControllerSourceTypeCamera;
и другими обычными настройками, и камера готова (или «диафрагма открыта») в этот момент.
Таким образом, если кто-то использует настраиваемый оверлей камеры, как я привык, он будет знать, когда диафрагма открыта, потому что она находится под вашим контролем.