objective-c - NSCell 重绘问题

标签 objective-c nstableview nscell nstableviewcell

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

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

最佳答案

长话短说: friend 在绘图时不要让 friend addSubview

这是管理控制界面的一个基本方面,没有特别明确的解释,但掌握它很重要。

让您的 Controller 决定 subview 的“顺序”,并且您可以高枕无忧,因为您知道该按钮不应该被公然弄乱(如果它在您的自定义绘图例程中被推来推去,则情况并非如此)。

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

更新: Here's a really good write up on designing custom controlsequally as great sample project附件 - 它体现了可以帮助避免此类问题的代码组织类型。例如..您会注意到在 Controller 类中他如何保持每个按钮独立、唯一并且独立于其他 View 的业务...

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

关于objective-c - NSCell 重绘问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11650414/

相关文章:

ios - 当我在 iOS 中创建 ScrollView 的导出时,按钮单击在 ScrollView 中没有响应

php - 来自温度值的 UIColor

ios - 'unsigned long ' UIUserNotificationSettings *' 的隐式转换不允许使用 arc

macos - 如何在 macOS 10.12+ 上自定义 NSTableView 标题?

cocoa - NSTableView如何点击单元格任意位置编辑文本?

swift - 隐藏 NSSearchField 的 lupe 图标

ios - 不需要按钮帮助的 Segue

objective-c - 在 NSTableView 中实现拖放

objective-c - Swift 1.2 为什么我不能继承任何 NSCell 的子类?

objective-c - 在 TableView 单元格中使用修饰键进行鼠标跟踪