Анимация переходов двух подпредставлений одновременно с CATransition - PullRequest
0 голосов
/ 20 февраля 2012

У меня есть мой основной вид, и когда пользователь нажимает кнопку «Показать», я хочу, чтобы произошли две вещи:

  1. Исчезает в черном UIView с альфа-0,5, охватывающим весь родительский вид,Я буду ссылаться на это как darkenBackground
  2. Слайд-представление второго контроллера представления (self.secondViewController.view) поверх darkenBackground

Когда пользователь закончил,они нажимают «Готово», и происходит следующее:

  1. darkenBackground исчезает и удаляется из суперпредставления.
  2. self.secondViewController.view выдвигается из экрана в нижнем направлении иудаляется из суперпредставления.

Все анимации работают одновременно.

До сих пор я был в состоянии выполнить первую часть (вроде как), переход-в.Это отлично работает.Но когда пользователь нажимает «Готово», переход не работает должным образом.Проблемы, с которыми я столкнулся:

  1. darkenBackground и self.secondViewController.view исчезают и удаляются, но self.secondViewController.view не должен был исчезнуть!Я попытался анимировать только второй вид, но он просто исчезает без анимации.
  2. Когда пользователь нажимает «Показать» в течение секунд времени (переход), появляется вид из предыдущего перехода.до анимации.Не похоже, что он был удален из суперпредставления ранее.

Вот мой код:

Когда пользователь нажимает «Показать»:

- (IBAction)showSecondView {

    darkenBackground = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 460)];
    [darkenBackground setBackgroundColor:[UIColor blackColor]];
    [darkenBackground setAlpha:0.5];

    self.secondViewController.view.frame = CGRectMake(0, 0, 320, 460);
    self.secondViewController.view.backgroundColor = [UIColor clearColor];

    [CATransaction begin];

    CATransition *animation = [CATransition animation];
    [animation setDuration:0.5];
    [animation setType:kCATransitionFade];

    CATransition *animation2 = [CATransition animation];
    [animation2 setDuration:0.5];
    [animation2 setType:kCATransitionMoveIn];
    [animation2 setSubtype:kCATransitionFromTop];
    [animation2 setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];

    [self.view addSubview:darkenBackground];
    [self.view addSubview:self.secondViewController.view];

    [[self.view layer] addAnimation:animation forKey:@"darkenBkgFadeIn"];
    [[self.secondViewController.view layer] addAnimation:animation2 forKey:@"ShowSecondView"];

    [CATransaction commit];
}

Когда пользователь нажимает «Готово» (функция, определенная в классе secondViewController.m, где она обращается к переменным контроллера основного вида через делегат):

- (IBAction)hideSecondView {

    [CATransaction begin];

    CATransition *animation = [CATransition animation];
    [animation setDuration:0.5];
    [animation setType:kCATransitionFade];

    CATransition *animation2 = [CATransition animation];
    [animation2 setDuration:0.5];
    [animation2 setType:kCATransitionPush];
    [animation2 setSubtype:kCATransitionFromBottom];
    [animation2 setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];

    [self.myParentController.darkenBackground removeFromSuperview];
    [self.myParentController.secondViewController.view removeFromSuperview];

    [[self.myParentController.view layer] addAnimation:animation forKey:@"darkenBkgFadeOut"];
    [[self.myParentController.secondViewController.view layer] addAnimation:animation2 forKey:@"RemoveSecondView"];

    [CATransaction commit];
}

В конечном счете, я хочу показать представление в том жетаким образом появляется модальное представление TWTweetComposeViewController, где фон темнеет и появляется контроллер.Я мог бы просто использовать модальный контроллер представления, но проблема, с которой я столкнулся, заключается в том, что при представлении контроллера представления он только «появляется» и не скользит снизу (так как мне требуется полупрозрачный фон, я не могу использовать значение по умолчанию).контекст для модального представления).

Не могу понять это, был бы признателен за некоторые рекомендации.

1 Ответ

0 голосов
/ 20 февраля 2012

Я предполагаю, что self.myParentController.view, используемый в -hideSecondView, совпадает с self.view в -showSecondView.Если это так, то вы применяете переход ко всему представлению здесь:

[[self.myParentController.view layer] addAnimation:animation forKey:@"darkenBkgFadeOut"];

Вы добавили self.secondViewController.view в качестве подпредставления self.view в -showSecondView, поэтому при последующем выполнениипереход на self.myParentController.view, он также будет применять переход ко всем своим подпредставлениям (то есть self.secondViewController.view).

Вместо применения перехода к self.myParentController.view в -hideSecondView, примените его напрямуюdarkenBackground:

[[self.myParentController.darkenBackground layer] addAnimation:animation forKey:@"darkenBkgFadeOut"];

Если я правильно помню, вы можете применить CATransitions, когда слои добавляются / удаляются в / из вида.Если нет, то вам нужно будет обернуть darkenBackground в отдельное представление контейнера и выполнить переходы для него, чтобы он не включал self.secondViewController.view при выполнении затухания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...