2016-01-18 3 views
0

У меня есть MTKView где я рендеринга треугольник, и я хочу, чтобы иметь возможность перевести его с помощью двух пальцев жест перетаскивания, который вызывает ScrollWheel: метод. Поведение по умолчанию метода прокрутки : - это создание дополнительных событий прокрутки для реализации плавной прокрутки, которая умирает со временем. Я хотел бы отключить это поведение и иметь жесткую прокрутку, которая заканчивается, как только я снимаю пальцы с трекпада. Кто-нибудь знает, как отключить плавную прокрутку для NSView?NSView отключить плавную прокрутку

ответ

1

Вы можете проверить свойство momentumPhase параметра NSEvent, чтобы определить, следует ли игнорировать событие или нет.

+0

Это сработало отлично! Большое спасибо! –

0

Да, проверка момента важна ... Кроме того, я добавляю элемент var isTouchEventActive для обнаружения жестов.

Кроме того, предотвратите скачки, игнорируя общий x + y + z delta 0!

- (void)touchesBeganWithEvent:(NSEvent *)event { isTouchEventActive = YES; } 
- (void)touchesMovedWithEvent:(NSEvent *)event { isTouchEventActive = YES; } 
- (void)touchesEndedWithEvent:(NSEvent *)event { isTouchEventActive = NO; } 
- (void)touchesCancelledWithEvent:(NSEvent *)event { isTouchEventActive = NO; } 

- (void)beginGestureWithEvent:(NSEvent *)event { isTouchEventActive = YES; } 
- (void)endGestureWithEvent:(NSEvent *)event { isTouchEventActive = NO; } 

- (void)magnifyWithEvent:(NSEvent *)event 
{ 
    double totalDelta = [event magnification]; 
    if (totalDelta == 0) 
     return; // i think this is the indication that a trackpad gesture has 'finished'... on the iphone, i think it means 'stop animate scroll now' 

    allowAnimate = NO; 
    [self zoom:totalDelta isSlider:NO isAbsolute:NO useMousePt:YES]; 
} 

- (void)scrollWheel:(NSEvent *)event { 
    NSUInteger flags = [event modifierFlags]; 

    NSRect visRect = [self visibleRect]; 
    CGFloat deltaX = [event deltaX], deltaY = [event deltaY], deltaZ = [event deltaZ]; 

    double totalDelta = deltaX + deltaY + deltaZ; 
    //printf("deltaX %f deltaY %f deltaZ %f totalDelta %f", deltaX, deltaY, deltaZ, totalDelta); 
    //NSLog(@"%@", [event description]); 
    if (totalDelta == 0) 
     return; // i think this is the indication that a trackpad gesture has 'finished'... on the iphone, i think it means 'stop animate scroll now' 

    // if option key held down, zoom 
    NSPoint focusPt = [self convertPoint:[event locationInWindow] fromView:NULL]; 
    if (NSPointInRect(focusPt , miniMapRect)) 
    { 
     // // focus first 
     // maybe too annoying... miniMapMouseCurrPt = NSMakePoint(focusPt.x - miniMapRect.origin.x, focusPt.y - miniMapRect.origin.y); 
     //[self focusOnMiniMap]; 

     // zoom second 
     allowAnimate = NO; 
     [self zoom:totalDelta isSlider:NO isAbsolute:NO useMousePt:YES]; 

    } 
    else if (flags & NSAlternateKeyMask) 
    { 
     allowAnimate = NO; 
     [self zoom:totalDelta isSlider:NO isAbsolute:NO useMousePt:YES]; 
    } 
    else 
    { 
     double theDeltaPixels; 
     theDeltaPixels = visRect.size.width/10.0; 

     if ([event respondsToSelector:@selector(momentumPhase)] && [event momentumPhase]) 
     { 
      DLog(@"ignoring trackpad momentum gesture"); 
     } 
     else if (isTouchEventActive) 
     { 
      if (flags & NSShiftKeyMask) // scroll left/right) 
      { 
       if (totalDelta > 0) 
        theDeltaPixels = -theDeltaPixels; 
       visRect.origin.x += theDeltaPixels; 
      } 
      else 
      { 
       visRect.origin.x -= deltaX * visRect.size.width/80.0; 
       visRect.origin.y -= deltaY * visRect.size.height/80.0; 
      } 
      //DLog(@"detaX %f y %f", deltaX, deltaY); 
     } 
     else 
     { 
      //DLog(@"detaX %f y %f total %f", deltaX, deltaY, totalDelta); 
      if (totalDelta > 0) 
       theDeltaPixels = -theDeltaPixels; // subtract time when scrolling up 
      //DLog(@"RulerView scrollWheel delta %f deltaX %f deltaY %f deltaZ %f", theDeltaPixels, deltaX, deltaY, deltaZ); 

      if (flags & NSShiftKeyMask) // scroll left/right 
       visRect.origin.x += theDeltaPixels; 
      else 
       visRect.origin.y += theDeltaPixels; 
     } 


     [[self superview] scrollRectToVisible:visRect]; 

     [self savePersistentFocusPt: 
     NSMakePoint(NSMidX([self visibleRect]), 
        NSMidY([self visibleRect]))]; 
    } 
} 

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

  • Нет связанных вопросов^_^