3

アプリケーションの UI をカスタマイズしようとしていますが、NSTableView の角を丸くしたいと考えています。だから私は NSTableView をサブクラス化し、これを得ました:

イムグル

ただし、テーブルにデータを入力して行を選択すると、次のように境界線の上に選択が描画されます。

イムグル

テーブル ビューの描画コードにクリップを追加しようとしましたが、機能しません。これを修正する方法について何か提案はありますか?

編集:

NSTableView の私の描画コードは次のとおりです。

- (void)drawRect:(NSRect)dirtyRect {
    [NSGraphicsContext saveGraphicsState];
    NSRect frame = NSMakeRect(0.0, 0.0, [self bounds].size.width, [self bounds].size.height-1.0);
    [[NSBezierPath bezierPathWithRoundedRect:frame xRadius:3.6 yRadius:3.6] addClip];
    [super drawRect:dirtyRect];
    [NSGraphicsContext restoreGraphicsState];
}

実際の丸みを帯びたフレームは、NSScrollView の drawRect メソッドで描画されます。興味深いことに、これにより最初と最後の行の選択がクリップされます。

イムグル

ただし、テーブルがスクロールしている場合はそうではありません:

イムグル

NSScrollView の丸みを帯びたフレーム内ですべての描画をクリップするにはどうすればよいですか?

4

2 に答える 2

3

CALayer を使用して、これをかなりうまく解決できました。NSScrollView から NSTableView 、さらに NSClipView まですべてをサブクラス化しようとしても、上記のレンダリングの問題が引き続き発生するため、最終的に次のコードを NSScrollView サブクラスの drawRect に追加しました。

if (!self.contentView.wantsLayer) {
    [self.contentView setWantsLayer:YES];
    [self.contentView.layer setCornerRadius:4.0f];
}

そして、NSScrollView の同じ drawRect メソッドでフレームを描画します。上記の問題をすべて解決します。

于 2012-12-13T18:21:27.107 に答える