Подкласс UIControl - как остановить сенсорный поток событий?
Я пишу приложение для настольных игр (например, шахматы). Основное представление распознает жесты смахивания (UISwipeGestureRecognizer), запущенные в любом месте в полноэкранном режиме, в результате чего доска вращается.
Теперь я добавил прозрачное подпредставление квадратной формы точно над доской. Это подкласс UIControl, который обнаруживает прикосновения - как движения пешек по доске:
[self.view addSubview:self.boardControl]
Я ожидал, что жесты смахивания будут заблокированы в области экрана, которая покрыта подклассом UIControl. И это не так. Поэтому, когда я делаю быстрое касание и перетаскиваю (прокручиваю) поверх своего квадратного элемента Board Board, сначала он определяется как ход пешки, а затем снова определяется как удар, который вращает доску.
Как я могу сделать свой подкласс UIControl, чтобы блокировать поток сенсорных событий, запущенных в его кадре, к его суперпредставлениям?
Я могу предотвратить реагирование моего приложения на жесты смахиванием, отфильтровывая касания на уровне суперпредставления, либо:
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
CGPoint location = [gestureRecognizer locationInView:self.view];
CGRect frame = self.boardControl.frame;
if ( CGRectContainsPoint(frame, location) )
return NO;
return YES;
}
или по:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldReceiveTouch:(UITouch *)touch
{
CGPoint location = [touch locationInView:self.view];
CGRect frame = self.boardControl.frame;
if (CGRectContainsPoint(frame, location))
return NO;
return YES;
}
но я хочу решить эту проблему на один уровень раньше: я хочу, чтобы boardControl не пропускал ни одного из запущенных в их событиях касания фрейма, выше в иерархии представлений.
Может ли подкласс UIControl "покрыть" свой супервизор и "съесть" все прикосновения, которые он получает, так что суперпредставлению не нужно будет обращаться к своему фрейму, чтобы угадать, нужно ли отфильтровывать такое касание или нет?
1 ответ
Все, что вам нужно, это реализовать UIGestureRecognizerDelegate
Это обеспечивает способ сделать запрошенные вещи.
Я думаю, что вы должны начать с gestureRecognizer:shouldReceiveTouch:
Примеры