Как поддерживать сенсорное перемещение по различным объектам?

#ios #touchesmoved

#iOS #touchesmoved

Вопрос:

В моем приложении есть несколько ярлыков, подобных этому…

введите описание изображения здесь

Что мне нужно сделать, так это то, что при нажатии на ярлык я просто показываю название ярлыка в нижней части экрана. Это отлично работает при нажатии на каждую ячейку отдельно. Но я хочу показать изменения, даже если пользователь нажимает на определенную метку и перемещает палец по другой метке. То есть, как только он нажимает на экран, куда бы ни перемещался его палец, я хочу отследить эти места и показать изменения. Как я могу это сделать? Пожалуйста, объясните вкратце.

Заранее спасибо

Комментарии:

1. Разве вы не можете использовать touchesMoved: в своем супервизоре для этого? Или протестируйте это с помощью hitTest:

Ответ №1:

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

Сначала создайте подкласс UIView для контейнера и перехватывайте события касания, переопределяя hitTest:withEvent: :

 -(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    // intercept touches
    if ([self pointInside:point withEvent:event]) {
        return self;        
    }
    return nil;
}
  

Установите этот пользовательский класс в качестве класса представления контейнера. Затем реализуйте различные touches*:withEvent: методы в вашем представлении контейнера. В вашем случае должно сработать что-то вроде этого:

 -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    // determine which view is under the touch
    UIView* view = [super hitTest:[[touches anyObject] locationInView:self] withEvent:nil];

    // get that label's text and set it on the indicator label
    if (view != nil amp;amp; view != self) {
        if ([view respondsToSelector:@selector(text)]) {
            // update the text of the indicator label
            [[self indicatorLabel] setText:[view text]];
        }
    }
}