首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSCell重绘问题

NSCell重绘问题
EN

Stack Overflow用户
提问于 2012-07-25 21:06:59
回答 2查看 1.2K关注 0票数 2

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

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

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

你会怎么做呢?我是不是找错人了?

相关代码如下:

代码语言:javascript
复制
- (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];
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-01 10:54:56

长话短说:朋友们在画画的时候不会让朋友 addSubview**,。**

这是管理控制界面的一个基本的,但不是特别好解释的方面,但重要的是要掌握。

让你的控制器指令子视图的“顺序”,你可以睡个好觉,因为你知道那个按钮不应该被公开地弄乱(如果它在你的自定义绘图例程中被推来推去,情况就不是这样)。

它很容易被困在这条小巷里,因为,就像,嘿,我在我的initWithFrame中添加了一个NSImageView,一切似乎都很好…但这不是你应该做的,我猜…当你开始对NSControl进行子类化,等等,你就会开始意识到为什么。

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

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

票数 5
EN

Stack Overflow用户

发布于 2012-07-27 23:50:07

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11650414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档