在 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 实际上并没有做任何事情,因为你没有给它一个fromValuetoValue;当您设置图层的不透明度时,它只是动画,因为在 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 上更改核心动画持续时间似乎不起作用的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式滑动时更改ViewPager动画持续时间

在 SwiftUI 中动态更改动画的持续时间

在动画期间更改 jQuery 的动画持续时间

viewDidLoad/viewDidAppear 的 UIView 动画?

viewDidAppear 上的动画 UIImageView 和 UITableView

更改动画持续时间 CSS3 在 Chrome 中不起作用