Модальный контроллер

Что я делаю:

В моем приложении я представляю 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];
}