У меня есть MTKView где я рендеринга треугольник, и я хочу, чтобы иметь возможность перевести его с помощью двух пальцев жест перетаскивания, который вызывает ScrollWheel: метод. Поведение по умолчанию метода прокрутки : - это создание дополнительных событий прокрутки для реализации плавной прокрутки, которая умирает со временем. Я хотел бы отключить это поведение и иметь жесткую прокрутку, которая заканчивается, как только я снимаю пальцы с трекпада. Кто-нибудь знает, как отключить плавную прокрутку для NSView?NSView отключить плавную прокрутку
0
A
ответ
1
Вы можете проверить свойство momentumPhase
параметра NSEvent
, чтобы определить, следует ли игнорировать событие или нет.
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]))];
}
}
Это сработало отлично! Большое спасибо! –