2012-01-21 2 views
13

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

}

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

+0

Если вы действительно хотите, чтобы этот код запускался на устройствах раньше, чем iOS 5, вам необходимо защитить вызов 'представленViewController', а также' rejectModalViewControllerAnimated'. – smparkes

+0

Если вы видите анимацию увольнения, звучит так, как будто этот код запускается, и его увольняют по другому пути. – smparkes

ответ

48

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

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

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

[[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. Это ответная анимация.

+0

Спасибо, но и вы, и H2CO3 игнорируете тот факт, что в моем коде есть часть withDuration. С уменьшенным кодом нет способа установить, как долго будет затухать вход/выход. И мое сообщение говорит «.. но не в течение определенного периода времени». Извините, мой титул, возможно, должен был сказать, как добиться постепенного исчезновения и контролировать его продолжительность, но я думал, что это очевидно из кода, опубликованного и описания, извините, если это не так. – Gruntcakes

+0

Отредактировано в ответ на комментарий – NJones

+4

Кажется, что в iOS8 вам нужно добавить self.modalTransitionStyle = UIModalTransitionStyleCrossDissolve также в представленииViewController, поэтому увольнение также является CrossDissolve –

9

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

@property(nonatomic, assign) UIModalTransitionStyle modalTransitionStyle 

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

Надежда, что помогает.

+0

Спасибо, он растворяется, но он делает это немедленно, в то время как у меня есть анимация .5 секунд на его внешний вид. Как я могу заставить его растворяться медленно? – Gruntcakes

+0

[ self.parentViewController rejectModalViewControllerAnimated: YES]; –

+0

Настройка Анимированная: к YES делает ее прокруткой, установка Анимированная: в НЕТ заставляет ее растворяться, но все же сразу. Я опубликовал свой последний код в приведенном выше правиле. – Gruntcakes

0

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

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

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

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

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

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

Смежные вопросы