2015-11-18 6 views
0

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

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 

    CGPoint touchPoint = [touch locationInView:self.view]; 

    if (!CGRectContainsPoint([self.view viewWithTag:21].frame, touchPoint)) { 
     [self dismissViewControllerAnimated:YES completion:nil]; 
    } 
} 

Вот изображение, которое показывает мой макет: Layout Image

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

PS: оба модала являются прозрачными UIViews, с меньшими видами внутри них для отображения содержимого.

+0

какой-то контроль за тем, чтобы красный вид присутствовал в «прикосновениях» зеленого вида. 'if (redView == false) {}' – Tim

ответ

1

Очевидно, что событие передается через контроллер вида на следующий ответчик.

В описании класса UIResponder.

По умолчанию реализация этого метода ничего не делает. Однако непосредственные подклассы UIKit UIResponder, в частности UIView, направляют сообщение в цепочку ответчиков. Чтобы отправить сообщение следующему ответчику, отправьте сообщение супер (суперклассу ); не отправляйте сообщение непосредственно следующему ответчику . Например,

[super touchesMoved: касается использованияEvent: event];

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

Так что, если вы не хотите, чтобы событие перешло к следующему ответчику, вы должны переопределить другие методы.

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { 

} 

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { 

} 

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { 

    UITouch *touch = [touches anyObject]; 
    CGPoint touchPoint = [touch locationInView:self.view]; 

    if (!CGRectContainsPoint([self.view viewWithTag:21].frame, touchPoint)) { 
     [self dismissViewControllerAnimated:YES completion:nil]; 
    } 
} 

- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { 

} 
+0

Вау! Спасибо за этот подробный ответ. – Minebomber