2011-12-24 3 views
3

NSScrollviewNSScrollview 안에 중첩되어 있습니다. 내부 뷰를 수평 스크롤 만 처리하도록하려면 어떻게해야합니까? 세로 스크롤은 외부보기를 이동해야합니다.다른 NSScrollView 내부의 NSScrollView

현재 내부보기에서 scrollWheel: 이벤트를 외부보기로 전달하지만 속도가 매우 느립니다.

+0

iPhone 또는 MacOS? 당신이 UIScrollView가 아닌 ​​NSScrollView를 말하고 있기 때문에 나는 MacOS를 추측하고 있습니다. –

+0

예, Mac OSS, 거기에 어떤 아이디어가 있습니까? – 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

또한 중첩 된 스크롤보기의 문제가있었습니다. 내부 스크롤보기는 수평으로 스크롤해야하고 외부 스크롤은 수직으로 스크롤해야합니다.

매직 마우스/트랙 패드에서 스크롤 이벤트를 처리 할 때 각 제스처에 대해 스크롤보기 중 하나만 선택하는 것이 중요합니다. 그렇지 않으면 손가락이 완벽하게 똑바로 움직이지 않을 때 이상한 경련이 발생합니다. 두 손가락으로 트랙 패드를 두드리면 두 스크롤러가 모두 표시되는지 확인해야합니다.

옛날 방식의 스크롤 휠을 사용하는 거대한 마우스 또는 마우스의 기존 스크롤 이벤트를 처리 할 때 이벤트에 제스처 단계 정보가 없으므로 각 이벤트에 대해 오른쪽 스크롤보기를 선택해야합니다.

@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

관련 문제