NSTextView オブジェクトで行ごとのスクロールを実装するにはどうすればよいですか? ユーザーがスクロールしようとする方法に関係なく、スクロール ノブをドラッグするか、トラックパッドで 2 本指のスクロール ジェスチャを使用するかに関係なく、動作する必要があります。さらに、スクロール ノブは常に個別のステップで移動する必要があります。(これは、まさに Apple の端末エミュレーターが動作する方法です。)
私が最初にやろうとしたことは、NSTextView をサブクラス化し、adjustScroll: (NSView から継承したもの) をオーバーライドすることでした。
- (NSRect)adjustScroll:(NSRect)newVisible {
NSRect modifiedVisible = newVisible;
NSFont *font = [self font];
CGFloat lineHeight = [[self layoutManager] defaultLineHeightForFont:font];
modifiedVisible.origin.x = (int)(modifiedVisible.origin.x/lineHeight) * lineHeight;
modifiedVisible.origin.y = (int)(modifiedVisible.origin.y/lineHeight) * lineHeight;
return modifiedVisible;
}
ただし、スクロールノブを使用すると、行ごとにスクロールするだけです。偶然、NSScrollView をサブクラス化すると、トラックパッドでスクロールするときにも行ごとにスクロールできることがわかりました。実際には何もしていないように見えますが (なぜこれが機能するのかは謎です)、オーバーライドされたメソッドは次のとおりです。これらは:
- (instancetype)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
return self;
}
- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
}
ただし、スクロール ノブは引き続き動きます。NSScroller をサブクラス化して setDoubleValue をオーバーライドする必要がありますか (それを試してみましたが、うまく機能しなかったため、解決策が難しいと感じましたが、可能かもしれません)、または、reflectScrolledClipView: をサブクラスで NSScrollView にオーバーライドできますか (それは機能しませんでした)まったく)、またはより良い解決策はありますか?