2

У меня возникли проблемы с UIPanGestureRecognizer, поскольку он просто вызывает селектор, когда у меня есть движение пальца, я хочу, чтобы он продолжал называть селектор, даже мой палец стоит на том же месте.UIPanGestureRecognizer остановить вызов селектора

На экране есть четыре объекта: один сверху, один справа, один на левой стороне и один внизу. У меня есть объект в центре экрана (это тот, который я перемещаю с помощью panGesture). Когда этот объект касается других, я хочу, чтобы он дал мне журнал, он работает, когда он касается, но если я держу палец в том же месте, он останавливается, чтобы дать мне журналы, если я немного пошевелится, он снова начнет давать мне журналы.

В любом случае я могу продолжать звонить селектору даже пальцем в том же месте?

вот пример кода:

- (void)moveObject:(UIPanGestureRecognizer *)sender 
{ 
    CGPoint translation = [sender translationInView:self.limiteDirecional]; 
    [sender setTranslation:CGPointMake(0, 0) inView:self.limiteDirecional]; 

    CGPoint center = sender.view.center; 
    center.y += translation.y; 
    int yMin = 0; 
    int yMax = self.limiteDirecional.frame.size.height; 

    if (center.y < yMin || center.y > yMax) 
     return; 

    sender.view.center = center; 

    center.x += translation.x; 
    int xMin = self.limiteDirecional.frame.size.width; 
    int xMax = 0; 

    if (center.x > xMin || center.x < xMax) 
     return; 

    sender.view.center = center; 

    if (CGRectIntersectsRect(sender.view.frame,self.Top.frame)) { 
     NSLog(@"TOP");   
    } 

    if (CGRectIntersectsRect(sender.view.frame,self.Botton.frame)) { 
     NSLog(@"BOTTON"); 
    } 

    if (CGRectIntersectsRect(sender.view.frame,self.Right.frame)) { 
     NSLog(@"RIGHT"); 
    } 

    if (CGRectIntersectsRect(sender.view.frame,self.Left.frame)) { 
     NSLog(@" LEFT"); 
    } 

    if (sender.state == UIGestureRecognizerStateEnded) { 
     sender.view.center = CGPointMake(self.view.frame.size.width/2, self.view.frame.size.height/2); 
    } 
} 
+1

Этот распознаватель жеста сам по себе этого не сделает. Вы можете использовать таймеры или «CADisplayLink» или что-то в этом роде, но чтобы предлагать решения, полезно знать, какую проблему вы пытаетесь решить. Какую проблему вы пытаетесь решить, получая уведомление об изменениях прикосновений, когда нет изменений в прикосновениях? – Rob

+0

Справа! это работает как джойстик, если вы перетаскиваете «MainObject» в контакт с «Sensors», он должен перемещать мой спрайт, но если я удерживаю «MainObject», даже если он касается «Sensor», он останавливается, чтобы переместить мой спрайт ! я должен подтолкнуть, чтобы не двигаться ... – rihurla

ответ

3

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

Используется CADisplayLink, что считается лучшей техникой для анимации, чем более старый способ использования NSTimer. Чтобы использовать CADisplayLink, вам необходимо выполнить add the needed framework, QuartzCore.framework, если вы еще этого не сделали. Также обратите внимание, что в моем жесте распознаватель, я проверяю состояние жеста, чтобы знать ли мы начать жест, в середине одного или окончание одного:

#import "ViewController.h" 
#import <QuartzCore/QuartzCore.h> 

@interface ViewController() 

@property (nonatomic, strong) CADisplayLink *displayLink; 
@property (nonatomic) CGPoint translationInView; 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UIPanGestureRecognizer *gesture = [[UIPanGestureRecognizer alloc] initWithTarget:self 
                       action:@selector(handleGesture:)]; 
    // I'm adding to the main view, but add it to whatever you want 
    [self.view addGestureRecognizer:gesture]; 
} 

- (void)startDisplayLink 
{ 
    self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)]; 
    [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
} 

- (void)stopDisplayLink 
{ 
    [self.displayLink invalidate]; 
    self.displayLink = nil; 
} 

- (void)handleDisplayLink:(CADisplayLink *)displayLink 
{ 
    NSLog(@"%s translationInView = %@", __FUNCTION__, NSStringFromCGPoint(self.translationInView)); 

    // Do here whatever you need to happen continuously while the user is in the 
    // middle of the gesture, whether their finger is moving or not. 
} 

- (void)handleGesture:(UIPanGestureRecognizer *)gesture 
{ 
    self.translationInView = [gesture translationInView:gesture.view]; 

    if (gesture.state == UIGestureRecognizerStateBegan) 
    { 
     [self startDisplayLink]; 

     // Do whatever other initialization stuff as the user starts the gesture 
     // (e.g. you might alter the appearance of the joystick to provide some 
     // visual feedback that they're controlling the joystick). 
    } 
    else if (gesture.state == UIGestureRecognizerStateChanged) 
    { 
     // Do here only that stuff that actually changes as the user is moving their 
     // finger in the middle of the gesture, but which you don't need to have 
     // repeatedly done while the user's finger is not moving (e.g. maybe the 
     // visual movement of the "joystick" control on the screen). 
    } 
    else if (gesture.state == UIGestureRecognizerStateEnded || 
      gesture.state == UIGestureRecognizerStateCancelled || 
      gesture.state == UIGestureRecognizerStateFailed) 
    { 
     [self stopDisplayLink]; 

     // Do whatever other cleanup you want to do when the user stops the gesture 
     // (e.g. maybe animating the moving of the joystick back to the center). 
    } 
} 
@end 

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

Смежные вопросы