ede*_*y05 4 core-animation avfoundation calayer ios
我正在尝试复制Apple在视频播放中的行为,允许用户拉伸视频图像以填充边界.
@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];
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试为不透明度这样的数字属性设置动画时,这很好用.但是,你会从类引用中注意到,AVPlayerLayer的videoGravity属性是一个NSString.类引用确实指出它是可动画的.
所以我的问题是:如何!?
我相信这可能与CALayer的内容属性以及可能的contentsGravity有某种关系.
正如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:@"%1$@%2$@.%3$@%2$@", @"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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4174 次 |
最近记录: |