2012-01-18 1 views
4

Я пытаюсь скопировать поведение Apple при воспроизведении видео, что позволяет пользователю растягивать видеоизображение, чтобы заполнить границы.Анимация AVPlayerLayer videoGravity свойство

@interface FHVideoPlayerView : UIView 
@end 
@interface FHVideoPlayerView 

+ (Class)layerClass 
{ 
    return [AVPlayerLayer class]; 
} 

- (void)setAspectMode:(FHVideoPlayerAspectMode)aspectMode animated:(BOOL)animated 
{ 
    FHVideoPlayerAspectMode current = [self aspectMode]; 
    FHVideoPlayerAspectMode final = aspectMode; 

    NSString *fromValue; 
    NSString *toValue; 

    AVPlayerLayer *layer = (AVPlayerLayer *)[self layer]; 

    switch (current) { 
     case FHVideoPlayerAspectFill: 
      fromValue = AVLayerVideoGravityResizeAspectFill; 
      break; 
     case FHVideoPlayerAspectFit: 
      fromValue = AVLayerVideoGravityResizeAspect; 
      break; 
     default: 
      break; 
    } 

    switch (final) { 
     case FHVideoPlayerAspectFill: 
      toValue = AVLayerVideoGravityResizeAspectFill; 
      break; 
     case FHVideoPlayerAspectFit: 
      toValue = AVLayerVideoGravityResizeAspect; 
      break; 
     default: 
      break; 
    } 

    if (toValue != fromValue) { 
     if (animated == YES) { 
      // Manually added CABasicAnimation based on the understanding the implicit animations are disabled for CALayers that back a UIView 
      CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"videoGravity"]; 
      [layer addAnimation:animation forKey:@"animateVideoGravity"]; 

      [CATransaction begin]; 
      [CATransaction setAnimationDuration:0.333]; 
     } 

     [layer setVideoGravity:toValue]; 

     if (animated == YES) { 
      [CATransaction commit]; 
     } 
    } 
} 

Это прекрасно работает, когда я пытаюсь анимировать числовое свойство, такое как непрозрачность. Но вы заметите из ссылки на класс, свойство videoGravity AVPlayerLayer - это NSString. Ссылка на класс указывает, что она анимативна.

Так что мой вопрос: как !?

Я считаю, что это, вероятно, так или иначе связано с содержимым контента CALayer и, возможно, с содержимым Gravity.

ответ

5

Как указал voromax, это ошибка в iOS 5.0. Я переделал версию -[AVPlayerLayer setVideoGravity:] в iOS 5.1, чтобы понять, как должна работать анимация. Вот как обходить ошибку и иметь приятную анимацию на iOS 5.0.

@implementation VideoPlayerView 

+ (Class) layerClass 
{ 
    return [AVPlayerLayer class]; 
} 

- (AVPlayerLayer *) playerLayer 
{ 
    return (AVPlayerLayer *)[self layer]; 
} 

- (NSString *) videoGravity 
{ 
    return self.playerLayer.videoGravity; 
} 

- (void) setVideoGravity:(NSString *)videoGravity 
{ 
    self.playerLayer.videoGravity = videoGravity; 

    // Workaround a bug in iOS 5.0 
    float avFoundationVersion = [[[NSBundle bundleForClass:[AVPlayerLayer class]] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey] floatValue]; 
    if (avFoundationVersion < 292.24f) 
    { 
     @try 
     { 
      NSString *contentLayerKeyPath = [NSString stringWithFormat:@"%[email protected]%[email protected]%[email protected]%[email protected]", @"player", [@"layer" capitalizedString], @"content"]; // playerLayer.contentLayer 
      CALayer *contentLayer = [self.playerLayer valueForKeyPath:contentLayerKeyPath]; 
      if ([contentLayer isKindOfClass:[CALayer class]]) 
       [contentLayer addAnimation:[CABasicAnimation animation] forKey:@"sublayerTransform"]; 
     } 
     @catch (NSException *exception) 
     { 
     } 
     self.bounds = self.bounds; 
    } 
} 

@end 
+0

Так что мне просто интересно, что у вас с этими спецификаторами формата? Я знаю, что вы пытаетесь запутать строку, но можете ли вы объяснить спецификаторы? –

+0

Удивительный обходной путь! Это вызвало большой урон при выходе 5.0, наконец, было исправлено в 5.1, но добавив, что исправление - отличная идея. – steipete

+0

Ха-ха 'AVPlayerLayer'. Мне нравится это имя. :) –

1

Это была ошибка в iOS 5.0 и iOS 5.0.1.

После обновления до iOS 5.1 анимация изменения гравитации видео начала работать снова.

+1

Хм ... кажется, вы правы. Хотя на это не повлияли контроллеры просмотра видео для Apple. Так может быть, есть еще один способ оживить гравитацию видео? – edelaney05

+0

Я думаю, что они просто не перекомпилировали их MPMoviePlayer с iOS 4.3 – voromax

+0

Я так не верю - они добавили новое свойство (airPlayVideoActive) и новое уведомление. [API отличается от 4.3 до 5.0] (https://developer.apple.com/library/ios/#releasenotes/General/iOS50APIDiff/index.html) – edelaney05