2

カスタム NSTableHeaderCell を使用した NSTableView の背景のクリアに関する問題が発生しました。テーブル列のサイズを変更するとき。

ここに画像の説明を入力

// The method for setting NSTableView in some place
// NSScrollView disabled Draw Background
- (void)setMainTableView:(NSTableView *)mainTableView {

     _mainTableView = mainTableView;
     [_mainTableView setBackgroundColor:[NSColor clearColor]];

     [[_mainTableView tableColumns] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

        NSString *columnTitle = [[obj headerCell] stringValue];
        MyTableHeaderCell *myCell = [[MyTableHeaderCell alloc] initTextCell:columnTitle];
        [obj setHeaderCell:myCell];
    }];
 }

//  Overriding NSTableHeaderCell Method
- (void)drawWithFrame:(CGRect)cellFrame inView:(NSView *)view {

    [[NSColor redColor] set];
    NSFrameRect(cellFrame);

    [super drawInteriorWithFrame:cellFrame inView:view];
}
4

3 に答える 3

3

+1 ラドゥ

具体的には、気になる人は誰でも.. Swiftでこのようなことをしたい場合は、次のようにすることができます:

final class MyTableHeaderCell : NSTableHeaderCell
{
    required init?(coder aDecoder: NSCoder)
    {
        fatalError("init(coder:) has not been implemented")
    }

    override init(textCell: String)
    {
        super.init(textCell: textCell)
        // you can also set self.font = NSFont(...) here, too!        
    }

    override func drawWithFrame(cellFrame: NSRect, inView controlView: NSView)
    {
        super.drawWithFrame(cellFrame, inView: controlView) // since that is what draws borders
        NSColor().symplyBackgroundGrayColor().setFill()
        NSRectFill(cellFrame)
        self.drawInteriorWithFrame(cellFrame, inView: controlView)
    }

    override func drawInteriorWithFrame(cellFrame: NSRect, inView controlView: NSView)
    {
        let titleRect = self.titleRectForBounds(cellFrame)
        self.attributedStringValue.drawInRect(titleRect)
    }
}
于 2016-09-29T02:30:04.600 に答える
1

以前のピクセルは、描画の前に API によって自動的にクリアされる必要があります。サイズ変更時にのみ発生するグリッチを見つけたようです。回避策は、自分でピクセルをクリアすることです。他のものを描画する前に、 cellFrame rect を白 (または背景色) で塗りつぶすだけです。

于 2014-05-07T14:22:41.350 に答える