После dismissModalViewControllerAnimated родительский вид устанавливается на весь экран - PullRequest
4 голосов
/ 17 сентября 2010

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

Before                After
+----------------+   +------------------+
|head            |   | detailview       |
+----------------+   |                  |
|detailview      |   |                  |
|                |   |                  |
|                |   |                  |
|                |   |                  |
+----------------+   +------------------+

Я создал «простой» пример проекта, в котором появляется ошибка.

http://github.com/rphl/modalTest

Пожалуйста, взгляните на это.

Ответы [ 4 ]

8 голосов
/ 19 сентября 2010

Это отчасти предположение, но обоснованное предположение после того, как немного поигрался с вашим кодом.

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

Я поместил в ваш MyDetailViewController следующее:* Что привело к следующему выводу:

2010-09-19 00:23:51.823 ModalTest[2478:207] {{0, 164}, {320, 316}}
2010-09-19 00:23:56.178 ModalTest[2478:207] {{0, 0}, {320, 480}}

Первая строка была выведена, когда деталь появилась впервые.Вторая строка была выведена, когда модальное представление было отклонено.

Теперь мне на самом деле не особенно нравится решение, которое я нашел, но это имеет желаемый эффект.В вашем sendMail методе:

ModalTestAppDelegate* appDelegate = [[UIApplication sharedApplication] delegate];
[appDelegate.viewController presentModalViewController:controller animated:YES];

И в вашем mailComposeController:didFinishWithResulterror: методе:

ModalTestAppDelegate* appDelegate = [[UIApplication sharedApplication] delegate];
[appDelegate.viewController dismissModalViewControllerAnimated:YES];

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

5 голосов
/ 18 мая 2012

Что-то, что работает для меня, было восстановить кадр после того, как модальный контроллер вида уволен. Пример кода:

Представление контроллера модального вида

[self presentModalViewController:self.modalViewController animated:YES];

Увольняющийся модальный контроллер вида

CGRect frame = self.view.frame;
[self.modalViewController dismissModalViewControllerAnimated:YES];
self.view.frame = frame;
2 голосов
/ 23 ноября 2011

У меня была эта проблема после подготовки моего приложения для iPhone для iPad. Это оказалось чем-то очень странным, и мне потребовались часы, чтобы найти это. Это было связано с авторотацией.

Для:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

Я возвращался Нет

Ранее я возвращался:

    return (interfaceOrientation == UIInterfaceOrientationPortrait);

По какой-то причине возвращение Нет привело к тому, что панель навигации оказалась ниже строки состояния после закрытия контроллера модального представления.

1 голос
/ 04 июня 2013

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

У меня есть контроллер, который помещается вконтроллер навигации, который сам по себе является первой вкладкой в ​​UITabBarController.От моего контроллера я представляю модальный контроллер представления, который воспроизводит полноэкранное видео, используя MPMoviePlayerController.Когда видео заканчивается, я программно закрываю контроллер модального вида и возвращаюсь к предыдущему экрану.Но иногда после увольнения строка состояния исчезала, а размер панели навигации изменялся, чтобы занять место в строке состояния.В других случаях панель навигации была наполовину обрезана и выглядела так, как будто она перекрывает строку состояния.

Такое поведение было замечено в большинстве случаев, но не всегда, что делало его очень запутанным.Я перепробовал много вещей, которые предлагают другие люди из StackOverflow, среди которых явное скрытие строки состояния в viewWillAppear:, возвращение YES по крайней мере для одной ориентации в shouldAutorotateToInterfaceOrientation:, представление контроллера модального представления из контроллера навигацииили даже контроллер tabBar (который является корневым контроллером представления моего окна), отказывающийся от метода протокола вместо вызова dismissViewControllerAnimated:completion: непосредственно из модального контроллера представления, играющего с MPMoviePlayerController уведомлениями и состояниями.Казалось, ничего не помогло.

В конце я понял, что мои проблемы возникают только тогда, когда видео заканчивается, а элементы управления видео (включая строку состояния) были скрыты.Я полагаю, что поскольку мой модальный контроллер представления является полноэкранным (его свойство wantsFullScreenLayout установлено в YES) и представляется из контроллера представления внутри контроллера навигации и контроллера tabBar, когда строка состояния скрыта в моментУвольнение, это заставляет контроллер навигации изменять размеры своего дочернего контроллера представления и заполнять экран, скрывая строку состояния или перекрывая ее.На самом деле я смог увидеть это, зарегистрировав размер моего DetailsViewController (тот, который помещается в контроллер навигации).

Итак, я сделал самую интуитивную вещь - я явно показал строку состояния прямо перед отключением контроллера модального представления.Это решило это полностью, и теперь мой код выглядит так:

1.Представление контроллера модального вида из DetailsViewController

[self presentViewController:controller animated:YES completion:NULL];  

2.Отстранение модального контроллера вида от самого себя

[[UIApplication sharedApplication] setStatusBarHidden:NO];  
[self dismissViewControllerAnimated:YES completion:nil];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...