изменение длительности Core Animation в ViewDidAppear не работает - PullRequest
0 голосов
/ 27 января 2012

Я пытаюсь отключить заставку 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 ]

1 голос
/ 28 января 2012

В качестве альтернативы, в viewWillAppear: вы можете создать экземпляр UIImageView с Default-Portrait ~ ipad.png, добавить его в self.view, использовать UIView animateWithDuration: animations: завершение: класс метод, чтобы анимировать значение от альфа до 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;
  }];
}
1 голос
/ 27 января 2012

Эта CABasicAnimation фактически ничего не делает, потому что вы не даете ей fromValue или toValue; когда вы устанавливаете непрозрачность слоя, это только анимация, потому что установка свойств в слоях Core Animation запускает неявную анимацию, продолжительность которой по умолчанию составляет около четверти секунды. Что вы хотите сделать, это:

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