Модальный контроллер
Что я делаю:
В моем приложении я представляю modal view controller (содержащий настройки приложения), используя следующий код:
optionsViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl;
[self presentModalViewController:optionsViewController animated:YES];
Этот переход просто завершает нижнюю часть представления, чтобы выставить несколько настроек. (Например, в приложении "Карты" ). Когда вы нажимаете верхнюю половину страницы, где исходное представление все еще присутствует, но отображается серым цветом, диспетчер модального просмотра автоматически отклоняется (обрабатывается ОС, я не использовал) t для этого).
-
Что не работает:
Это отлично работает в iOS 4 (мое приложение в настоящий момент находится в App Store). Но в iOS 5 похоже, что Apple изменила поведение этого перехода, и контроллер вида больше не отклоняется. Я пытаюсь воспроизвести поведение, которое ранее выполнялось ОС, но не могу понять, как это сделать.
-
Что я пробовал:
Добавление невидимой кнопки в верхнюю часть представления параметров не работает. Затем страница скручивается полным образом, чего я не хочу.
Кроме этого, я застрял. Как мне повторить, как это сработало изначально (или я делаю это неправильно с самого начала!). Любая помощь очень ценится!
Ответы
Ответ 1
Чувак, я столкнулся с той же проблемой.. и вот что я нашел об использовании parentViewController:
Обратите внимание, что с 5.0 этого больше нет вернет представление контроллер.
Это было записано в файле заголовка UIViewController...
Я использую ShareKit, и modalViewController отлично работает в iOS4, но в iOS5 он просто не уйдет! Это связано с тем, что в своем коде они используют:
[[currentView parentViewController] dismissModalViewControllerAnimated:animated];
и parentViewController вернет nil, так как это модальный представленный контроллер представления...
В поисках решения я нашел ваш вопрос. Итак, я решил сам исправить: P
Я изменил предыдущую строку следующим образом:
[currentView dismissModalViewControllerAnimated:YES];
Работает как шарм.
EDIT: В зависимости от того, как вы интерпретируете исходный вопрос, есть два ответа. Здесь второе:
В iOS5 кажется, что модальный контроллер только отклоняется, когда вы нажимаете завиток, но не выше завитка или задней части. В iOS5, чтобы фактически получить модальное представление, чтобы отбросить себя при нажатии на фон или выше завитка, я добавил следующий код в контроллер, чтобы прослушивать краны на модальном представлении, но игнорировать нажатия на кнопки. Это должно имитировать поведение предыдущей версии iOS при работе с модальным контроллером со скручиванием страницы.
- (void)viewDidLoad
{
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
tap.numberOfTapsRequired = 1;
tap.numberOfTouchesRequired = 1;
tap.delegate = self;
[backgroundView addGestureRecognizer:tap];
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
//change it to your condition
if ([touch.view isKindOfClass:[UIButton class]]) {
return NO;
}
return YES;
}
- (void)handleTap:(UITapGestureRecognizer *)sender {
[self dismissModalViewControllerAnimated:YES];
}
Ответ 2
Какой код вы используете для отклонения модального контроллера? Я видел такой код:
[self.parentViewController dismissModalViewControllerAnimated: YES];
который не работает во всех версиях ОС. Однако это:
[self dismissModalViewControllerAnimated: YES];
следует.
Ответ 3
У меня была та же проблема, также затрагивает тех, кто использует:
[self.parentViewController.parentViewController dismissModalViewControllerAnimated:YES];
Я исправляю его с помощью Observer, добавляя это, когда у вас было отклонение:
[[NSNotificationCenter defaultCenter] postNotificationName:@"yourObserverName" object:self];
И это в родительском контроллере родительского представления:
// add in viewDidLoad for example
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissModalVCFromParent:) name:@"yourObserverName" object: nil];
//The function
- (void) dismissModalVCFromParent:(NSNotification *)notif
{
[self dismissModalViewControllerAnimated:YES];
}
// Don't forget remove
[[NSNotificationCenter defaultCenter] removeObserver:self];
Ответ 4
Это, похоже, работает над (теперь окончательной версией) ios 5.
Я заметил, что вам нужно нажать конкретную область, чтобы отклонить скручивание страницы - нажатие рядом с краями верхней части экрана, похоже, ничего не делает, но центр, размытый раздел над графическим изображением страницы постоянно приводит к отклонению модального вида.
Я не уверен, является ли это поведение узкого региона контакта новым для ios 5 или уже существует, и я никогда не замечал этого раньше. Надеюсь, это полезно!
Ответ 5
Спасибо, ребята, это спасло меня много времени. Я только заметил, что методы presentModalViewController
и dismissModalViewController
устарели в соответствии с исходным кодом для UIViewControoler.h
. Существуют альтернативные методы presentViewController
и dismissViewController
.
Ответ 6
В iOS5 кажется, что модальный контроллер только отклоняется, когда вы нажимаете завиток, но не выше завитка или задней части. В iOS5, чтобы фактически получить модальное представление, чтобы отбросить себя при нажатии на фон или выше завитка, я добавил следующий код в контроллер, чтобы прослушивать краны на модальном представлении, но игнорировать нажатия на кнопки. Это должно имитировать поведение предыдущей версии iOS при работе с модальным контроллером со скручиванием страницы.
- (void)viewDidLoad
{
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
tap.numberOfTapsRequired = 1;
tap.numberOfTouchesRequired = 1;
tap.delegate = self;
[backgroundView addGestureRecognizer:tap];
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
//change it to your condition
if ([touch.view isKindOfClass:[UIButton class]]) {
return NO;
}
return YES;
}
- (void)handleTap:(UITapGestureRecognizer *)sender {
[self dismissModalViewControllerAnimated:YES];
}