4

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 にオーバーライドできますか (それは機能しませんでした)まったく)、またはより良い解決策はありますか?

4

0 に答える 0