支持视图的NSTableView:插入的列宽/边距问题

时间:2011-11-16 23:19:03

标签: macos cocoa nstableview

我有一个基于视图的NSTableView,它通常有一列。但是,按下按钮时,我想要从左侧滑入一个新列(非常类似于单击“邮件”中的“编辑”按钮时iPhone上发生的情况)。现在,我想要滑动的视图是一个非常简单的视图,它绘制了一个坚实的背景:它的drawRect:只是

[[NSColor blueColor] set];    
[[NSBezierPath bezierPathWithRect:[self bounds]] fill];

在我的NSTableView的委托中,我有以下内容:

- (IBAction)buttonPressed:(id)sender
{
        NSTableColumn *newColumn = [[NSTableColumn alloc] initWithIdentifier:@"InPreviewColumn"];
        [newColumn setWidth:40];
        [newColumn setMinWidth:[newColumn width]];
        /* To make up for there not being an insertColumnAt: method, 
           hide the column, add it, and move it to the front before showing it. */
        [newColumn setHidden:YES];

        [availableFontsView beginUpdates];
        [availableFontsView addTableColumn:newColumn];
        [availableFontsView moveColumn:1 toColumn:0];
        [availableFontsView endUpdates];
        [newColumn setHidden:NO];
}

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
   /* ... code for main column ... */
   else if([[tableColumn identifier] isEqualToString:@"InPreviewColumn"])
   {
     USSolidBackgroundView *v = [tableView makeViewWithIdentifier:[tableColumn identifier] owner:self];
     if(!v)
     {
        v = [[[USSolidBackgroundView alloc] initWithFrame:NSMakeRect(0, 0, [tableColumn width], 0)] autorelease];
        [v setIdentifier:[tableColumn identifier]];
        [v setAutoresizingMask:NSViewMinXMargin | NSViewWidthSizable | NSViewMaxXMargin];
     }

     return v;
     }
}

然而,当我这样做时,我最终得到了这个结果(新列的蓝色部分和主列的开头之间有一个很大的非蓝色边距):

enter image description here

当没有附加列时,没有余量,所以我很确定问题不在于其他视图(因为当它是唯一显示的视图时没有边距)。

我使用了日志语句来验证纯色视图的边界总是宽度为40(在其drawRect :)中,并且至少在创建视图时,表格列的宽度也是40。

那么这个边际来自哪里?无论我如何调整色谱柱,看起来只有大约一半是蓝色。因此,色谱柱越大,余量越大。

如何将整个额外列设为蓝色?

1 个答案:

答案 0 :(得分:3)

问题是我的愚蠢:在绘制字体名称的视图中,我基于[self frame]的位置。哪个错了。

[自我限制]是要走的路。我知道的。简直不敢相信我犯了这个错误。业余时间。

如果你徘徊在这个问题上,请随意投票关闭它或标记它或者它应该在Stackoverflow上工作的任何东西。

道歉。