NSCell重绘问题

时间:2012-07-25 13:06:59

标签: objective-c nstableview nscell nstableviewcell

我正在创建一个NSCell子类,它将一些对象直接绘制到视图上(使用drawInRect:fromRect:operation:fraction:respectFlipped:hints:),并且还使用NSView的NSButton选择器绘制一个addSubview:实例。

虽然使用第一种方法绘制的对象都是相关的,但是我在正确绘制NSButton时遇到了问题。问题是我的NSButton个实例会在正确的位置绘制,但会多次覆盖。

我已经在互联网上研究了一段时间,有些人建议使用缓存,但我不确定这是否有效。 (使用for循环包含按钮的数组肯定会导致慢滚动,因为我显示了大量数据...)

你会怎么做?我吠叫错了树吗?

这是相关代码:

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{    
    NSRect _controlRect = cellFrame;

    float _Y = cellFrame.origin.y;

    NSRect _accessoryRect = NSMakeRect(_controlRect.size.width - 70.0f, _Y + 9.0f, 50.0f, 23.0f);

    _switch = [self _choiceSwitch];

    [_switch setFrame:_accessoryRect];
    [controlView addSubview:_switch];
}

2 个答案:

答案 0 :(得分:5)

长话短说朋友在绘画时不要让朋友addSubview

这是管理控制接口的一个基本的,没有特别好解释的方面,但是很重要。

让你的控制器决定子视图的“顺序”,并且知道该按钮不应该被彻底弄乱(如果它在你的自定义绘图例程中被推挤,则不是这种情况)。 p>

很容易陷入这条小巷,因为,嘿,我在我NSImageView中添加了initWithFrame,一切似乎都没问题 ......但它是< em>只是不是你应该怎么做,我猜...当你开始继承NSControl时,等等就是当你开始意识到原因时。

已更新: Here's a really good write up on designing custom controls附加了equally as great sample project - 这体现了可以帮助避免此类问题的代码组织。例如..你会在控制器类中注意到他如何保持每个按钮的独立,独特和独立于其他视图的业务......

for (int butts = 0; butts < 3; butts++) {
    NSRect buttFrame = NSMakeRect(0, butts * 10, 69, 10);
    ExampleButt *butt = [[ExampleButt alloc]initWithFrame:buttFrame];
    [mainView addSubview:butt];
}

enter image description here

答案 1 :(得分:2)

“绘制”NSButton通过在每次绘制单元格时将其实例添加到视图层次结构中绝对是一个坏主意。相反,创建一个NSButtonCell并根据您的喜好配置它。然后,在你的-[NSCell drawInteriorWithFrame:inView:]中使用一个单元格ivar来绘制它的外观。

如果您希望在表格视图的每个单元格中都有一个可点击的NSButton实例,请尽可能避免拨打addSubview:。每次执行此操作时,控件视图可能会使其布局无效,并从头开始重新绘制所有内容,以便在您的情况下进行某种递归。