Палец вверх 0
Перевод
Перевод

изменение длительности Core Animation в ViewDidAppear не работает

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

Какие-нибудь мысли?

ios uiviewcontroller calayer cocoa-touch core-animation
задан SaldaVonSchwartz 27 янв. 2012 г., 22:52:15
источник

2 ответа

Решение 1
Перевод
Перевод

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

- (void)fadeOutLogo
{
    [CATransaction begin];
    [CATransaction setAnimationDuration:2];
    [logoLayer setOpacity:0];
    [CATransaction commit];
}
ответ дан Noah Witherspoon 27 янв. 2012 г., 22:59:14
источник
Палец вверх 1
Перевод
Перевод

В качестве альтернативы, в 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;
  }];
}
ответ дан StephenAshley.developer 28 янв. 2012 г., 0:11:44
источник