IOS: события касания не отправляются на следующий контроллер, пока модаль отклоняется

В моем Storyboard я определил a modal segue. Соответствующий модальный вид отклоняется с помощью кнопки и простой:

- (IBAction)dismiss:(id)sender {
    [self dismissViewControllerAnimated:YES completion:^{
        return;
    }];   
}

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

Моя цепочка контроллеров:

UINavigationController -> visibleViewController -> modal Controller

(но обратите внимание, что modal Controller фактически представлен navigationController - тем, как он настроен по умолчанию в раскадровке).

Как вы можете убедиться, что как только начнется переход, сенсорные события будут отправлены на следующий контроллер?

Ответ 1

То, что вы описываете, - это обычное поведение iOS, а не Model ViewController. Ввод или выход из ViewController с помощью push и pop также ожидают завершения перехода до получения событий касания в пункте назначения ViewController.

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

Например:

- (IBAction)hideContainer:(id)sender {   

    [UIView animateWithDuration:0.4 
                          delay:0.0         
                        options:UIViewAnimationOptionAllowUserInteraction
                     animations:^
                             {
                                 self.container.alpha = 0;
                             }
                     completion:^(BOOL finished){}];   
}

Ответ 2

Когда вы представляете или отклоняете какой-либо контроллер вида по модулю, во время переходов ваше представление диспетчера режима просмотра добавляется системой на переходный вид.

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

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

например. во время перехода на увольнение у вас будет что-то вроде этого:

Modal VC View
----------------
Intercepting View
--------------------------
Transitioning View
-------------------------------------------
Presenting View Controller view
------------------------------------------------------------------
Window
------------------------------------------------------------------------------

Затем вы теоретически сможете перенаправить ваши штрихи в представление представления представления.