10

Я не могу скрыть анимацию открытия затвора камеры iphone для своего приложения. Я использую UIImagePickerController для доступа к iphone-камере и с использованием собственных контроллеров наложения. Есть ли способ удалить начальную анимацию затвора (также известную как Iris) при запуске камеры. СпасибоСкрыть/показать iPhone-камеру Ирис/Затвор анимации

[EDIT]

Для тех, кто хочет знать, как изменить камеры диафрагмы анимации.

Эта функция вызывается до начала анимации диафрагмы камеры.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    // Here is were I make the camera preview fit the entire screen. 
    // This might violate the "don't change the view hierarchy"-rule. 
    // So I am not sure if it is valid for App Store commitment. 
    // However, the NSLogs are used to 
    // figure out which subview is the actual Camera Preview which turns out 
    // to be the PLPreviewView. (uncomment to se the printouts). 
    // Change it's size to fit the entire screen (and scale it accordingly 
    // to avoid distorted image 

    NSLog(@"WillShowViewController called..."); 

    NSLog(@"VC:view:subviews\n %@\n\n", [[viewController view] subviews]); 

    NSLog(@"VC:view:PLCameraView:subviews\n %@\n\n", [[[[viewController view] subviews] objectAtIndex: 0] subviews]); 

    NSLog(@"VC:view:PLCameraView:PLPreviewView:subviews\n %@\n\n", [[[[[[viewController view] subviews] objectAtIndex: 0] subviews] objectAtIndex: 0] subviews]); 
    NSLog(@"VC:view:PLCameraView:PLCropOverLay:subviews\n %@\n\n", [[[[[[viewController view] subviews] objectAtIndex: 0] subviews] objectAtIndex: 1] subviews]); 
    NSLog(@"VC:view:PLCameraView:UIImageView:subviews\n %@\n\n", [[[[[[viewController view] subviews] objectAtIndex: 0] subviews] objectAtIndex: 2] subviews]); 

} 

В приведенной выше функции вы можете пройти через каждый слой, используя обычный синтаксис NSMuatableArray как objectAtIndex

надеюсь, что это может помочь вам.

С уважением,

Анкур

+1

Я также хотел бы узнать ответ на этот вопрос. Был поиск и ничего не видел. Дайте нам знать, если вы это поняли! –

+0

У вас есть решение? – Fourj

+0

Да, я нашел решение, играя с иерархией представлений UIImagePickerController. – Ankur

ответ

0

Я возился с этим немного, но посылая различные комбинации методов зрения жизненного цикла на селекторе изображения. (viewWillAppear, viewDidAppear и т. д.) Но я не помню, какие из них работали.

5

Использование this answer в качестве отправной точки, я, наконец, решить эту проблему:

ПРИМЕЧАНИЕ: Это, очевидно, не 3.3.1-совместимым.

  1. Прослушайте UINavigationControllerDidShowViewControllerNotification на вашем UIImagePickerController и PLCameraViewIrisAnimationDidEndNotification во всем мире.

  2. Пройдите по иерархии вида (начиная с основного UIWindow), ища PLCameraView. Сохраните индекс представления по основному UIWindow, как вам понадобится позже.

  3. Извлеките PLCameraView из его superView. При желании вставьте свой собственный взгляд в глобальный индекс 0.

  4. Когда анимация ирисы закончена, удалите свой вид и добавьте PLCameraView по его первоначальному указателю.

0

Извините, что ответили так поздно. Я нашел решение для этого хорошо, я играл с иерархией представлений cameraView и добавил свой собственный слой наверху всего. Анимация прошла там, и как только затвор был открыт, верхний слой был удален. Если кому-то нужна дополнительная помощь с кодом, пожалуйста, дайте мне знать, я дам точные шаги и синтаксис.

-Ankur

+0

Не могли бы вы разместить свой код в своем вопросе, поскольку я столкнулся с той же проблемой и мне нужно скрыть эту анимацию затвора. –

0

Ниже функция вызывается до начала анимации камеры радужки.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    // Here is were I make the camera preview fit the entire screen. 
    // This might violate the "don't change the view hierarchy"-rule. 
    // So I am not sure if it is valid for App Store commitment. 
    // However, the NSLogs are used to 
    // figure out which subview is the actual Camera Preview which turns out 
    // to be the PLPreviewView. (uncomment to se the printouts). 
    // Change it's size to fit the entire screen (and scale it accordingly 
    // to avoid distorted image 

    NSLog(@"WillShowViewController called..."); 

    NSLog(@"VC:view:subviews\n %@\n\n", [[viewController view] subviews]); 

    NSLog(@"VC:view:PLCameraView:subviews\n %@\n\n", [[[[viewController view] subviews] objectAtIndex: 0] subviews]); 

    NSLog(@"VC:view:PLCameraView:PLPreviewView:subviews\n %@\n\n", [[[[[[viewController view] subviews] objectAtIndex: 0] subviews] objectAtIndex: 0] subviews]); 
    NSLog(@"VC:view:PLCameraView:PLCropOverLay:subviews\n %@\n\n", [[[[[[viewController view] subviews] objectAtIndex: 0] subviews] objectAtIndex: 1] subviews]); 
    NSLog(@"VC:view:PLCameraView:UIImageView:subviews\n %@\n\n", [[[[[[viewController view] subviews] objectAtIndex: 0] subviews] objectAtIndex: 2] subviews]); 

} 

В приведенной выше функции вы можете пройти через каждый слой, используя обычный синтаксис NSMuatableArray как objectAtIndex

надеюсь, что это может помочь вам.

С уважением,

Ankur Ответ

+0

Благодарим вас за форматирование кода. Я не знал об этом. – Ankur

0

joshwa в полностью скрывает весь вид камеры на время радужки анимации. Для моих целей мне нужен был вид камеры, только без анимации радужной оболочки. Я смог выполнить это с небольшой настройкой его метода. Как отмечали другие, это может быть или не быть разрешено в магазине приложений, поскольку мы возимся с иерархией представлений, а также прослушиваем недокументированные уведомления. Необходимы

3 Иварс:

UIImagePickerController *imagePickerController; 
UIView *plCameraIrisAnimationView; // view that animates the opening/closing of the iris 
UIImageView *cameraIrisImageView; // static image of the closed iris 

Скрыть закрытое изображение РОГ и снять вид анимации. Я попытался просто скрывает вид анимации, а также, но анимация была еще видна:

- (void)receivedNavigationControllerDidShowViewControllerNotification:(NSNotification *)notification { 
    UIView *view = imagePickerController.view; 
    [plCameraIrisAnimationView release]; 
    plCameraIrisAnimationView = nil; 
    cameraIrisImageView = nil; 
    while (view.subviews.count && (view = [view.subviews objectAtIndex:0])) { 
     if ([[[view class] description] isEqualToString:@"PLCameraView"]) { 
      for (UIView *subview in view.subviews) { 
       if ([subview isKindOfClass:[UIImageView class]]) { 
        cameraIrisImageView = (UIImageView *)subview; 
       } 
       else if ([[[subview class] description] isEqualToString:@"PLCropOverlay"]) { 
        for (UIView *subsubview in subview.subviews) { 
         if ([[[subsubview class] description] isEqualToString:@"PLCameraIrisAnimationView"]) { 
          plCameraIrisAnimationView = [subsubview retain]; 
         } 
        } 
       } 
      } 
     } 
    } 
    cameraIrisImageView.hidden = YES; 
    [plCameraIrisAnimationView removeFromSuperview]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"UINavigationControllerDidShowViewControllerNotification" object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedPLCameraViewIrisAnimationDidEndNotification:) name:@"PLCameraViewIrisAnimationDidEndNotification" object:nil]; 
} 

Когда анимация закончится, отобразите изображения радужной оболочки и повторно добавить вид анимации:

- (void)receivedPLCameraViewIrisAnimationDidEndNotification:(NSNotification *)notification { 
    cameraIrisImageView.hidden = NO; 

    UIView *view = imagePickerController.view; 
    while (view.subviews.count && (view = [view.subviews objectAtIndex:0])) { 
     if ([[[view class] description] isEqualToString:@"PLCameraView"]) { 
      for (UIView *subview in view.subviews) { 
       if ([[[subview class] description] isEqualToString:@"PLCropOverlay"]) { 
        [subview insertSubview:plCameraIrisAnimationView atIndex:1]; 
        [plCameraIrisAnimationView release]; 
        plCameraIrisAnimationView = nil; 
        break; 
       } 
      } 
     } 
    } 

    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"PLCameraViewIrisAnimationDidEndNotification" object:nil]; 
} 
+0

Не работает на iOS 5. –

+0

Да, он не работает на iOS5, я попытался заменить его на AVCaptureSessionDidStartRunningNotification и AVCaptureSessionDidStopRunningNotification, но он работает на iOS5, но не с тем же поведением на iOS 4 – AmineG

1

прилагающегося через похожее: я хотел, чтобы затвор появился, когда я делаю снимок, запускаемый кнопкой в ​​self.cameraOverlayView UIImagePickerController. Прибыв на эту страницу, сделал некоторые дополнительные исследования и пришел к этому решению.

Синопсис:

@interface MyController : UIImagePickerController 
...  
- (id) init { 
... 
    self.cameraOverlayView = _my_overlay_; 
    self.showsCameraControls = NO; 
... 
} 
... 
- (void) onMyShutterButton { 
    [self takePicture]; 
     // You want the shutter animation to happen now. 
     // .. but it does not. 
} 

Решение:

// Some constants for the iris view and selector 
NSString* kIrisViewClassName = @"PLCameraIrisAnimationView"; 
SEL kIrisSelector = NSSelectorFromString(@"animateIrisOpen"); 

@implementation MyController { 
... 
    UIView* iris_; 
} 
- (void) viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    // Find the iris view in the siblings of your overlay view 
    for (UIView* view in self.cameraOverlayView.superview.subviews) { 
     if ([kIrisViewClassName isEqualToString:[[view class] description]]) { 
      // It will be hidden by 'self.showsCameraControls = NO'. 
      view.hidden = false; 
      // Extra precautions - as this is undocumented. 
      if ([view respondsToSelector:kIrisSelector]) { 
       iris_ = view; 
      } 
      break; 
     } 
    } 
} 
- (void) animateIrisOpen { 
    if (iris_) { 
     [iris_ performSelector:kIrisSelector]; 
    } 
} 
... 
- (void) onMyShutterButton { 
    [self takePicture]; 
    [self animateIrisOpen]; // Voila - the shutter happens 
} 
0

Изложить на ответ Каталин, в (который был большим кстати), я обнаружил, если изменить метод "animateIrisOpen" слегка , презентация на дробях лучше ... но заметна.

- (void) animateIrisOpen { 
    if (iris_) { 
     iris_.hidden = NO; 
     [iris_ performSelector:kIrisSelector]; 
    } 
}