Обнаружение открытой диафрагмы камеры на iPhone

Для наложения камеры cutom мне нужно выяснить, когда диафрагма открыта, потому что мой оверлей всегда будет отображаться, пока диафрагма закрыта (а затем анимируется для открытия).

Любые идеи ?


person strange99    schedule 15.10.2009    source источник


Ответы (5)


Вы можете прослушивать уведомление 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];
     }
}
person ddoughty    schedule 04.11.2009
comment
Я видел достаточно вещей, которые перестали работать в недокументированных API камеры между 2.x и 3.x, я не уверен, что буду полагаться на недокументированный вызов. - person mikestew; 05.11.2009

Похоже, что PLCameraViewIrisAnimationDidEndNotification больше не получает уведомления в iOS5.

Я не могу понять, что является подходящим решением, когда диафрагма закончила открываться, должен быть другой вариант, а не использование 3-секундного таймера.

Проверьте здесь: https://devforums.apple.com/message/561008#561008

person markturnip    schedule 11.10.2011

У меня есть 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
person Andy Lister    schedule 06.10.2012

Я решил эту проблему так: я инициализирую все элементы со свойством hidden, установленным на YES, а затем вызываю селектор с 3-секундной задержкой после вызова камеры, где я устанавливаю все элементы на hidden = NO. Это не идеальное решение, но похоже, что оно работает, и любое отставание после открытия диафрагмы незначительно.

person Mirkules    schedule 08.04.2011

Вы уже должны знать, когда камера готова сделать снимок. По крайней мере, так как я использую настраиваемый оверлей камеры, я инициирую просмотр с чем-то вроде self.sourceType = UIImagePickerControllerSourceTypeCamera; и другими обычными настройками, и камера готова (или «диафрагма открыта») в этот момент.

Таким образом, если кто-то использует настраиваемый оверлей камеры, как я привык, он будет знать, когда диафрагма открыта, потому что она находится под вашим контролем.

person mikestew    schedule 17.10.2009
comment
Это не ответ на его вопрос. Его проблема в том, что его оверлей виден во время анимации радужной оболочки, и он хочет показать что-то другое на оверлее только после завершения анимации. Вы не можете контролировать, сколько времени потребуется iPhone, чтобы представить контроллер камеры и открыть диафрагму; вы узнаете только тогда, когда попросите контроллер представления запустить этот процесс. - person ddoughty; 04.11.2009
comment
Ответил на него так хорошо, как я мог его разобрать. :-) Мой оверлей делает именно это: появляется только после завершения анимации. Фактически, глядя на отладочную версию на моем телефоне прямо сейчас, есть краткий (почти не обнаруживаемый, если бы я не искал его) момент, когда старый оверлей отображается после анимации и перед отображением измененного оверлея. Наложение никогда не отображается поверх анимации. Если OP хочет проследить и подтвердить, что это желаемое поведение, я могу выкопать код и опубликовать последовательность, которую я использую. - person mikestew; 05.11.2009
comment
Независимо от того, кто задает вопрос, мне интересен ваш код. :-) Кажется, вы имеете в виду, что у вас есть два оверлея, но где / когда вы меняете с одного на другое? Другой мой вопрос связан с вашей строкой self.sourceType, которая подразумевает, что вы подклассифицируете средство выбора, но, возможно, это было просто сокращением в вашем ответе? Код, который я видел и использовал, следует этой теме: a) создать настраиваемое представление b) создать средство выбора c) добавить представление в качестве наложения для средства выбора d) установить sourceType средства выбора e) представить средство выбора Когда вы это сделаете при этом вы видите, что диафрагма открыта над вашим пользовательским видом. - person ddoughty; 05.11.2009