Подтвердить что ты не робот

Как отклонить модальный VC с постепенным исчезновением анимации?

Я использую следующий код в моем представлении 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;}];
}

}

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

4b9b3361

Ответ 1

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

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

Изменить в ответ на то, что время является проблемой:. Расскажите о коде оскорбления. Мы сосредоточимся только на истинной части, поскольку она по существу идентична else.

[[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;
}];

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

Ответ 2

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

@property(nonatomic, assign) UIModalTransitionStyle modalTransitionStyle

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

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

Ответ 3

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

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

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

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

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

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