Как отклонить модальный ВК с затухающей анимацией? - PullRequest
16 голосов
/ 22 января 2012

Я использую следующий код в своем представлении VC для перехода в дочерний модальный VC, и это прекрасно работает:

self.infoViewController.view.alpha = 0.0;
[self.navigationController presentModalViewController:self.infoViewController animated:NO];
[UIView animateWithDuration:0.5
             animations:^{self.infoViewController.view.alpha = 1.0;}];

Однако я не могу заставить его исчезнуть, я попробовал несколько вещей, это последняя попытка, которая не работает:

- (IBAction)dismissAction:(id)sender
{
if ([[self parentViewController] respondsToSelector:@selector(dismissModalViewControllerAnimated:)])
{
    [[self parentViewController] dismissModalViewControllerAnimated:YES];
    self.parentViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    self.parentViewController.view.alpha = 0.0;
    [UIView animateWithDuration:0.5
                     animations:^{self.parentViewController.view.alpha  = 1.0;}];
} else 
{
    [[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];
    self.presentedViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    self.presentedViewController.view.alpha = 0.0;
    [UIView animateWithDuration:0.5
                     animations:^{
                         self.presentedViewController.view.alpha  = 1.0;}];
}

}

Контроллер модального представления исчезает, но сразу, а не в течение периода времени, как это происходит при его отображении.

Ответы [ 3 ]

49 голосов
/ 22 января 2012

Это (оригинальная часть) не должно отвлекать от правильного ответа H2CO3. UIModalTransitionStyleCrossDissolve делает в значительной степени именно тот эффект, который вы ищете. Вы просто не устанавливаете modalTransitionStyle, пока не поздно. Замените весь ваш код этими функциями в соответствующих местах:

-(void)show{
    self.infoViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentModalViewController:self.infoViewController animated:YES];
}
- (IBAction)dismissAction:(id)sender{
    [self dismissModalViewControllerAnimated:YES];
}

Отредактируйте в ответ на проблему с синхронизацией: Давайте поговорим о коде ошибки. Мы сконцентрируемся только на истинной части if, поскольку она по существу идентична остальной.

[[self parentViewController] dismissModalViewControllerAnimated:YES];
self.parentViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
self.parentViewController.view.alpha = 0.0;
[UIView animateWithDuration:0.5
                 animations:^{self.parentViewController.view.alpha  = 1.0;}];

Если вы ищете взаимную анимацию, это не так. В вашей исходной анимации вы устанавливаете альфа следующего представления в 0, затем представляете следующий контроллер представления, затем устанавливаете альфа его представления в 1. Таким образом, логически вам нужно отклонить контроллер представления после анимации; Это действительно легко с помощью блоков. Код будет выглядеть примерно так:

[UIView animateWithDuration:0.5 animations:^{
    self.view.alpha = 0;
} completion:^(BOOL b){
    [self.presentingViewController dismissModalViewControllerAnimated:NO];
    self.view.alpha = 1;
}];

Эта строка кода анимирует альфа-представление представления до 0, затем (после завершения) отклоняет представленный контроллер представления и устанавливает альфа-представление представления обратно в 1. Это взаимная анимация.

10 голосов
/ 22 января 2012

В документах UIViewController мы можем найти:

@property(nonatomic, assign) UIModalTransitionStyle modalTransitionStyle

Установите для этого свойства значение UIModalTransitionStyleCrossDissolve, и оно будет правильно растворяться:)

Надеюсь, это поможет.

0 голосов
/ 10 ноября 2012

Полагаю, это может быть полезно для тех героических парней, которые все еще пытаются использовать MPMoviePlayerViewController в полноэкранном режиме и с ориентацией, которая отличается от основного приложения.

IВы потратили буквально половину рабочего дня, играя с MPMoviePlayerViewController в модальном или не модальном виде.Но с этим вообще не повезло, в смысле смены анимации перехода.(Модальный режим необходим для установки ориентации, которая отличается от основной ориентации приложения).

Я пробовал presentViewController или presentModalViewController, но результат тот же.Независимо от того, какой тип установлен в свойстве modalTransitionStyle, если я сделаю [... dismissViewControllerAnimated: true ...], тогда стиль перехода по умолчанию (UIModalTransitionStyleCoverVertical) используется в любом случае.Я проверил это на устройстве iOS 5.1 и в симуляторе iOS 6.

Я не пробовал другие типы контроллеров ... Учитывая, что у общего контроллера есть метод dismissMoviePlayerViewControllerAnimated, я могу предположить, что этот метод используется в любом случаеза увольнение видеоконтроллера, независимо от того, как он появился.(Входящие переходы также не работали для меня, за исключением того, что они не обрабатывались как CoverVertical (в случае изменения modalTransitionStyle).

Итак, мое решение было вообще не использовать анимацию перехода . Я уверен, что у Apple были некоторые причины для того, чтобы разрешить только определенную анимацию для MovieViewController (я очень на это надеюсь, и это было сделано не из-за «лени»), но если они хотели, чтобы пользователь получал какой-то приятный опыт, они терпели неудачукак в моем приложении, это даже лучше, когда видео появляется без какой-либо анимации (что, конечно, хуже, чем CrossDisolving), но это лучше, чем банальный CoverVertical.

Если смотреть с точки зрения разработчика, это действительноПохоже, они тратят гораздо больше денег на дизайнеров, чтобы рисовать красивые значки для клиентов вместо более приятной и эффективной работы разработчиков. (

...