在ViewDidAppear上更改核心动画持续时间似乎不起作用

时间:2012-01-27 18:52:16

标签: ios cocoa-touch uiviewcontroller core-animation calayer

我正试图让iPad启动画面淡出,以便在2秒内显示我的应用程序的主界面。主界面是我的主视图控制器和视图,在导航控制器内。

所以我做了以下事情:

UINavigationController与我的根视图控制器。 根视图控制器的接口全部布局,最后一步是一个CALayer,它具有相同的png,用于覆盖界面的初始屏幕。

这个想法是,一旦真正的闪屏消失,仍然有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秒内。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

CABasicAnimation实际上并没有做任何事情,因为你没有给它fromValuetoValue;当您设置图层的不透明度时,它只是动画,因为核心动画图层上的设置属性会触发隐式动画,其默认持续时间约为四分之一秒。你想要做的是:

- (void)fadeOutLogo
{
    [CATransaction begin];
    [CATransaction setAnimationDuration:2];
    [logoLayer setOpacity:0];
    [CATransaction commit];
}

答案 1 :(得分:1)

或者,在viewWillAppear中:您可以使用Default-Portrait~ipad.png实例化UIImageView,将其添加到self.view,使用UIView animateWithDuration:animations:completion:class方法将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;
  }];
}