在 ViewDidAppear 上更改核心动画持续时间似乎不起作用
Posted
技术标签:
【中文标题】在 ViewDidAppear 上更改核心动画持续时间似乎不起作用【英文标题】:changing Core Animation duration on ViewDidAppear doesn't seem to work 【发布时间】:2012-01-27 18:52:15 【问题描述】:我正在尝试让 iPad 闪屏淡出以在 2 秒内显示我的应用程序的主界面。主界面是我的主视图控制器和视图,位于导航控制器内。
所以我做了以下事情:
UINavigationController 与我的根视图控制器。 根视图控制器的界面已全部布局,最后一步是具有相同 png 的 CALayer,用于覆盖界面的启动屏幕。
这个想法是,一旦真正的启动屏幕消失了,CALayer 仍然存在。然后我将 CAlayer 淡出以显示界面。它有点工作:淡入淡出发生,但无论我为动画设置多长时间,它仍然发生得太快。
代码如下:(logoLayer 是一个 ivar,mainCanvas 是 self.view 中的一个容器视图,我在其中插入了大多数子视图——用于其他屏幕变暗类型的效果。)
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self)
// Custom initialization
self.view.layer.backgroundColor = [UIColor clearColor].CGColor;
[self setLayerContent:[[NSBundle mainBundle] pathForResource:@"interfaceBackground" ofType:@"png"]];
[self layoutNavigationButtonWithResource:@"button1" glowing:YES forAction:@"biblioteca"];
[self layoutNavigationButtonWithResource:@"button2"glowing:YES forAction:@"portfolio"];
NSString *logoPath = [[NSBundle mainBundle] pathForResource:@"Default-Portrait~ipad" ofType:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:logoPath];
logoLayer = [[CALayer layer] retain];
logoLayer.contents = (id)image.CGImage;
logoLayer.bounds = CGRectMake(0, 0, image.size.width, image.size.height);
logoLayer.anchorPoint = CGPointMake(0, 0);
logoLayer.opacity = 1;
[mainCanvas.layer addSublayer:logoLayer];
return self;
- (void)viewDidAppear:(BOOL)animated
[super viewDidAppear:animated];
[self performSelector:@selector(fadeOutLogo) withObject:nil afterDelay:0.1];
- (void)fadeOutLogo
CABasicAnimation *a = [CABasicAnimation animation];
a.duration = 10;
[logoLayer addAnimation:a forKey:@"opacity"];
[logoLayer setOpacity:0];
请注意,我什至延迟了对动画代码的调用以防万一。我也得到了 10 秒的值。这对于褪色来说是荒谬的。仍然......褪色发生在大约 0.2 秒内。
有什么想法吗?
【问题讨论】:
【参考方案1】:CABasicAnimation 实际上并没有做任何事情,因为你没有给它一个fromValue
或toValue
;当您设置图层的不透明度时,它只是动画,因为在 Core Animation 图层上设置属性会触发隐式动画,其默认持续时间约为四分之一秒。你想做的是这样的:
- (void)fadeOutLogo
[CATransaction begin];
[CATransaction setAnimationDuration:2];
[logoLayer setOpacity:0];
[CATransaction commit];
【讨论】:
好吧,显式事务肯定是另一种处理方式。但是我上面的代码仍然是暂时覆盖图层动作字典的有效方法,并且除了在初始化主视图时的这种情况之外,它总是有效的。实际上,我这样做的方式确实隐含地创建了一个事务。 我刚刚试了一下,您的建议确实有效。那太棒了!但是..知道为什么我的不知道吗?意思是,我知道你原来的答案。但是我错了,我的代码通过设置新的持续时间替换了图层字典中 @"opacity" 的隐式操作,并且当我调用 [logoLayer setOpacity:0] 时,我正在使用新的持续时间进行隐式动画处理?我发誓这在过去对我有用【参考方案2】:或者,在 viewWillAppear: 你可以用 Default-Portrait~ipad.png 实例化一个 UIImageView,将它添加到 self.view,使用 UIView animateWithDuration:animations:completion: 类方法将 alpha 的值设置为 0 2 秒的周期,然后在完成块中移除并释放 UIImageView。下面的代码演示了这个想法,使用 UIView 而不是 UIImageView:
-(void)viewWillAppear:(BOOL)animated
[super viewWillAppear: animated];
UIView __block *fadeView = [[UIView alloc]
initWithFrame: CGRectMake(0, 0, 320, 460)];
fadeView.backgroundColor = [UIColor blackColor];
[self.view addSubview: fadeView];
[UIView animateWithDuration: 2 animations:^
fadeView.alpha = 0;
completion:^(BOOL finished)
fadeView = nil;
];
【讨论】:
以上是关于在 ViewDidAppear 上更改核心动画持续时间似乎不起作用的主要内容,如果未能解决你的问题,请参考以下文章
viewDidLoad/viewDidAppear 的 UIView 动画?