NSScrollview
が別のNSScrollview
の中にネストされています。どのようにして、内側のビューが水平スクロールのみを処理するのですか?垂直スクロールでは、外側のビューを移動する必要があります。別のNSScrollView内のNSScrollView
現在、私はscrollWheel:
イベントを内部ビューから外側のビューに渡しますが、非常に遅いです。
NSScrollview
が別のNSScrollview
の中にネストされています。どのようにして、内側のビューが水平スクロールのみを処理するのですか?垂直スクロールでは、外側のビューを移動する必要があります。別のNSScrollView内のNSScrollView
現在、私はscrollWheel:
イベントを内部ビューから外側のビューに渡しますが、非常に遅いです。
これは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
また、ネストされたスクロールビューの問題もありました。内側のスクロールビューは水平方向にスクロールし、外側は垂直方向にスクロールする必要があります。
マジックマウス/トラックパッドからのスクロールイベントを処理するときは、各ジェスチャーのスクロールビューの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で、これは発生しない問題:
これはマウンテンライオンでテストインナースクロールビューのための私のサブクラスは、あります。
これは主に10.10で私のために働いた。 '+(BOOL)isCompatibleWithResponsiveScrolling {return YES;}を追加する必要がありました。 } 'NSScrollViewは' -scrollWheel: 'のオーバーライドを検出するので、非応答のスクロールにはバグがあると思います。 – joerick
iPhoneまたはMacOS?あなたがUIScrollViewではなくNSScrollViewを言っているので、私はMacOSを推測しています。 –
はい、Mac OSの、そこに任意のアイデア? – NeXT5tep