2011-12-24 3 views
3

У меня есть NSScrollview, вложенный внутри другой NSScrollview. Как сделать только горизонтальную прокрутку внутреннего вида? Вертикальная прокрутка должна перемещать внешний вид.NSScrollView внутри другого NSScrollView

В настоящее время я передаю событие scrollWheel: во внешний вид с внутреннего вида, но он очень медленный.

+0

iPhone или MacOS? Я предполагаю MacOS, так как вы говорите NSScrollView, а не UIScrollView. –

+0

Да, Mac os, любая идея есть? – NeXT5tep

ответ

2

Это мой подкласс NSScrollView, который делает то, что вы просите. Так как это просто передавая события, которые не заботятся о вверх по цепочке ответчик он должен быть производительным, как если бы это было не подкласс (или по крайней мере близко)

ч файл

#import <Cocoa/Cocoa.h> 

@interface HorizontalScrollView : NSScrollView 

@end 

и m

@implementation HorizontalScrollView 

- (void)scrollWheel:(NSEvent *)theEvent { 
    NSLog(@"%@", theEvent); 
    if(theEvent.deltaX !=0) 
     [super scrollWheel:theEvent]; 
    else 
     [[self nextResponder] scrollWheel:theEvent]; 

} 
@end 
5

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

При обработке событий прокрутки от магической мыши/трекпада важно выбрать только один из видов прокрутки для каждого жестов, иначе вы увидите странное подергивание, когда ваши пальцы не будут двигаться совершенно прямо. Вы также должны убедиться, что нажатие на трекпад двумя пальцами показывает оба скроллера.

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

Это мой подкласс для внутренней точки зрения прокрутки, испытываются только в 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 это не вызывает проблем.

+2

Это работало для меня 10.10, в основном. Мне нужно было добавить '+ (BOOL) isCompatibleWithResponsiveScrolling {return YES; } ', потому что NSScrollView обнаруживает переопределения' -scrollWheel: ', и я думаю, что есть ошибка в нечувствительной прокрутке. – joerick

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