У меня также была проблема вложенных представлений прокрутки.Внутреннее представление прокрутки должно прокручиваться по горизонтали, а внешнее прокручивание по вертикали.
При обработке событий прокрутки с помощью волшебной мыши / трекпада важно выбрать только одно из представлений прокрутки для каждого жеста, в противном случае вы увидитестранный рывок, когда ваши пальцы не двигаются идеально ровно.Вы также должны убедиться, что касание трекпада двумя пальцами показывает оба скроллера.
При обработке устаревших событий прокрутки от могучей мыши или мыши со старомодными колесами прокрутки необходимо выбрать правильный вид прокрутки для каждого события, потому чтоотсутствует информация о фазе жеста в событиях.
Это мой подкласс для представления внутренней прокрутки, протестированный только в 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 это не вызывает проблем.