2011-12-24 12 views
3

NSScrollviewが別のNSScrollviewの中にネストされています。どのようにして、内側のビューが水平スクロールのみを処理するのですか?垂直スクロールでは、外側のビューを移動する必要があります。別のNSScrollView内のNSScrollView

現在、私はscrollWheel:イベントを内部ビューから外側のビューに渡しますが、非常に遅いです。

+0

iPhoneまたはMacOS?あなたがUIScrollViewではなくNSScrollViewを言っているので、私はMacOSを推測しています。 –

+0

はい、Mac OSの、そこに任意のアイデア? – NeXT5tep

答えて

2

これはNSScrollViewの私のサブクラスで、あなたが求めているものです。それは単に、それがレスポンダチェーンアップ気にしないイベントを渡しているので、サブクラスではなかった(または少なくとも近い)

Hファイル

#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

また、ネストされたスクロールビューの問題もありました。内側のスクロールビューは水平方向にスクロールし、外側は垂直方向にスクロールする必要があります。

マジックマウス/トラックパッドからのスクロールイベントを処理するときは、各ジェスチャーのスクロールビューの1つだけを選択することが重要です。そうしないと、指が完全にまっすぐに動かない場合には、また、2本の指でトラックパッドをタップすると、両方のスクロールバーが表示されるようにする必要があります。

イベントのジェスチャフェーズ情報がないため、巨大なマウスや旧式のスクロールホイールを備えたマウスからの従来のスクロールイベントを処理する場合は、各イベントの右スクロールビューを選択する必要があります。

@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

関連する問題