Я пытаюсь скопировать поведение 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.0, наконец, было исправлено в 5.1, но добавив, что исправление - отличная идея. – steipete
Ха-ха 'AVPlayerLayer'. Мне нравится это имя. :) –