У меня также была проблема с вложенными представлениями прокрутки. Внутреннее представление прокрутки должно прокручиваться горизонтально, а внешнее — вертикально.
При обработке событий прокрутки с помощью волшебной мыши/трекпада важно выбирать только одно из представлений прокрутки для каждого жеста, иначе вы увидите странные рывки, когда ваши пальцы двигаются не идеально прямо. Вы также должны убедиться, что при касании трекпада двумя пальцами отображаются оба скроллера.
При обработке устаревших событий прокрутки от могучей мыши или мышей со старомодными колесиками прокрутки вы должны выбрать правильное представление прокрутки для каждого события, потому что в событиях нет информации о фазе жеста.
Это мой подкласс для просмотра внутренней прокрутки, проверенный только в Mountain Lion:
@interface PGEHorizontalScrollView : NSScrollView {
BOOL currentScrollIsHorizontal;
}
@end
@implementation PGEHorizontalScrollView
-(void)scrollWheel:(NSEvent *)theEvent {
/* Ensure that both scrollbars are flashed when the user taps trackpad with two fingers */
if (theEvent.phase==NSEventPhaseMayBegin) {
[super scrollWheel:theEvent];
[[self nextResponder] scrollWheel:theEvent];
return;
}
/* Check the scroll direction only at the beginning of a gesture for modern scrolling devices */
/* Check every event for legacy scrolling devices */
if (theEvent.phase == NSEventPhaseBegan || (theEvent.phase==NSEventPhaseNone && theEvent.momentumPhase==NSEventPhaseNone)) {
currentScrollIsHorizontal = fabs(theEvent.scrollingDeltaX) > fabs(theEvent.scrollingDeltaY);
}
if ( currentScrollIsHorizontal ) {
[super scrollWheel:theEvent];
} else {
[[self nextResponder] scrollWheel:theEvent];
}
}
@end
Моя реализация не всегда корректно перенаправляет события отмены жестов, но, по крайней мере, в 10.8 это не вызывает проблем.
person
Jakob Egger
schedule
29.11.2012