Получение объектов UITouch для UIGestureRecognizer

Есть ли способ получить объекты UITouch, связанные с жестом? UIGestureRecognizer, похоже, не имеет для этого никаких методов.


person Morrowless    schedule 15.12.2010    source источник


Ответы (6)


Джей прав... тебе понадобится подкласс. Попробуйте этот для размера, это из одного из моих проектов. В DragGestureRecognizer.h:

@interface DragGestureRecognizer : UILongPressGestureRecognizer {

}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

@end

@protocol DragGestureRecognizerDelegate <UIGestureRecognizerDelegate>
- (void) gestureRecognizer:(UIGestureRecognizer *)gr movedWithTouches:(NSSet*)touches andEvent:(UIEvent *)event;
@end

А в DragGestureRecognizer.m:

#import "DragGestureRecognizer.h"


@implementation DragGestureRecognizer

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

    [super touchesMoved:touches withEvent:event];

    if ([self.delegate respondsToSelector:@selector(gestureRecognizer:movedWithTouches:andEvent:)]) {
        [(id)self.delegate gestureRecognizer:self movedWithTouches:touches andEvent:event];
    }

}

@end 

Конечно, вам нужно будет реализовать

- (void) gestureRecognizer:(UIGestureRecognizer *)gr movedWithTouches:(NSSet*)touches andEvent:(UIEvent *)event; 

метод в вашем делегате, например:

DragGestureRecognizer * gr = [[DragGestureRecognizer alloc] initWithTarget:self action:@selector(pressed:)];
gr.minimumPressDuration = 0.15;
gr.delegate = self;
[self.view addGestureRecognizer:gr];
[gr release];



- (void) gestureRecognizer:(UIGestureRecognizer *)gr movedWithTouches:(NSSet*)touches andEvent:(UIEvent *)event{

    UITouch * touch = [touches anyObject];
    self.mTouchPoint = [touch locationInView:self.view];
    self.mFingerCount = [touches count];

}
person wpearse    schedule 16.12.2010
comment
Не забудьте добавить #import ‹UIKit/UIGestureRecognizerSubclass.h› в файл DragGestureRecognizer.h - person HotJard; 17.02.2013

Если вас интересует только местоположение, вам не нужно создавать подклассы, вы будете уведомлены об изменениях местоположения касания из UIGestureRecognizer.

Инициализировать с целью:

self.longPressGestureRecognizer = [[[UILongPressGestureRecognizer alloc] initWithTarget: self action: @selector(handleGesture:)] autorelease];
[self.tableView addGestureRecognizer: longPressGestureRecognizer];

Обработайте UIGestureRecognizerStateChanged, чтобы получить изменения местоположения:

- (void)handleGesture: (UIGestureRecognizer *)theGestureRecognizer {
    switch (theGestureRecognizer.state) {
        case UIGestureRecognizerStateBegan:
        case UIGestureRecognizerStateChanged:
        {
            CGPoint location = [theGestureRecognizer locationInView: self.tableView];

            [self infoForLocation: location];

            break;
        }

        case UIGestureRecognizerStateEnded:
        {
            NSLog(@"Ended");

            break;
        }

        default:
            break;
    }
}
person pfo    schedule 01.06.2012
comment
Это не получает UITouch, оно получает только CGPoint для локального фрейма определенного представления. - person Chris; 14.12.2014

Если вам нужно только узнать местоположение жеста, вы можете вызвать метод locationInView: или locationOfTouch:inView: для объекта UIGestureRecognizer. Однако, если вы хотите сделать что-то еще, вам понадобится подкласс.

person neilkimmett    schedule 16.11.2011
comment
И locationOfTouch:inView: также дает вам местоположение каждого касания отдельно. - person Nestor; 06.11.2019

Если вы пишете свой собственный UIGestureRecognizer, вы можете переопределить сенсорные объекты:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

или аналогичный перемещенный, завершенный или отмененный

В документах Apple содержится множество информация о подклассах

person Jay    schedule 15.12.2010

Вот способ добавления длинного нажатия к произвольному UIView.

Это позволяет запускать длительное нажатие на любом количестве UIViews. В этом примере я ограничиваю доступ к методу UIView с помощью тегов, но вы также можете использовать isKindOfClass.

(Из того, что я обнаружил, вы должны использовать touchesMoved для LongPress, потому что touchesBegan срабатывает до того, как LongPress станет активным)

подкласс - .h

            #import <UIKit/UIKit.h>
            #import <UIKit/UIGestureRecognizerSubclass.h>

            @interface MyLongPressGestureRecognizer : UILongPressGestureRecognizer

            - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

            @property (nonatomic) CGPoint touchPoint;
            @property (strong, nonatomic) UIView* touchView;

            @end

подкласс - .m

            #import "MyLongPress.h"

            @implementation MyLongPressGestureRecognizer

            - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
            {
                UITouch * touch = [touches anyObject];
                self.touchPoint = [touch locationInView:self.view];
                self.touchView  = [self.view hitTest:[touch locationInView:self.view] withEvent:event];
            }

            #pragma mark - Setters

            -(void) setTouchPoint:(CGPoint)touchPoint
            {
                _touchPoint =touchPoint;
            }

            -(void) setTouchView:(UIView*)touchView
            {
                _touchView=touchView;
            }
            @end

контроллер просмотра - .h

                           //nothing special here

контроллер просмотра - .m

            #import "ViewController.h"
            //LOAD
            #import "MyLongPress.h"

            @interface ViewController ()

            //lOAD
            @property (strong, nonatomic) MyLongPressGestureRecognizer* longPressGesture;

            @end

            @implementation PDViewController

            - (void)viewDidLoad
            {
                [super viewDidLoad];

                //LOAD
                self.longPressGesture =[[MyLongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressHandler:)];
                self.longPressGesture.minimumPressDuration = 1.2;
                [[self view] addGestureRecognizer:self.longPressGesture];
            }               

            //LOAD
            -(void) setLongPressGesture:(MyLongPressGestureRecognizer *)longPressGesture {
                _longPressGesture = longPressGesture;
            }

            - (void)longPressHandler:(MyLongPressGestureRecognizer *)recognizer {
                    if (self.longPressGesture.touchView.tag >= 100) /* arbitrary method for limiting tap */
                    {
                        //code goes here
                    }
            }
person MGM    schedule 27.03.2013

Просто и быстро:

NSArray *touches = [recognizer valueForKey:@"touches"];

Где распознаватель вашего UIGestureRecognizer

person Timur Mustafaev    schedule 29.04.2014
comment
iOS 8 [‹UIPinchGestureRecognizer 0x15eb36d0› valueForUndefinedKey:]: этот класс не соответствует кодированию ключевого значения для касаний клавиш. - person Nicolas Manzini; 10.11.2014