2

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

虽然使用第一种方法绘制的对象都绘制正确,但我在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];
}
4

2 回答 2

5

长话短说朋友不让朋友addSubview,一边画画。

这是管理控制接口的一个基本的,并且不是特别清楚解释的方面,但重要的是要掌握。

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

很容易被困在这条小巷里,因为,就像,嘿,我NSImageView在我的里面加了一个initWithFrame,一切似乎都还好……但这有点不是你应该怎么做的,我猜……当你开始子类化时NSControl 等是您开始意识到原因的时候。

更新: 这里有一篇关于设计自定义控件的非常好的文章,附带一个同样出色的示例项目- 它体现了可以帮助避免此类问题的代码组织。例如..您会在控制器类中注意到他如何使每个按钮保持独立、唯一且独立于其他视图的业务...</p>

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

在此处输入图像描述

于 2012-08-01T02:54:56.303 回答
2

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

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

于 2012-07-27T15:50:07.190 回答