0

我无法以编程方式创建和绘制 NSTextFieldCell 重新创建与在 Interface Builder 中构建并由 Cocoa 自动绘制时等效配置的 NSTextFieldCells 相同的视觉外观。

Context 是一个自定义的 NSView,它显示用户可以选择、删除或替换的内容。尽管此内容是非文本的,但我希望该字段类似于 NSTextField,因此我尝试将 NSTextFieldCell 投入服务以绘制与相应 NSTextField 匹配的边框、背景填充等。

我按如下方式设置单元格(在自定义控件 init() 期间):

textFieldCell = [[NSTextFieldCell alloc] init];
[textFieldCell setDrawsBackground: YES];
[textFieldCell setBackgroundColor: NSColor.blueColor];
[textFieldCell setBackgroundStyle: NSBackgroundStyleNormal];
[textFieldCell setBezeled: YES];
[textFieldCell setStringValue: @""];

然后在自定义控件的drawRect中,

- (void) drawRect: (NSRect) rect
{
    // Draw an NSTextField-like background
    if( isSelectAndDeletable)
    {
         [textFieldCell drawWithFrame: [self bounds] inView: self];
    }
    ...  // more content drawing here
 }

这会在屏幕上生成适当厚度和大小的 1 像素帧,并用蓝色填充。但是框架本身是灰色的,而不是蓝色的,并且填充接触到顶部的框架(没有白色边距)并且在底部错过了两个像素(厚的白色边距)。相比之下,当我让 Cocoa 将我的 textFieldCells 绘制为 NSTextField 的一部分或作为在 Interface Builder 中创建的独立单元格时,框架是用单元格的背景颜色绘制的,并且填充是用一个像素的白色边距插入的。

这张图片说明了这个问题。它显示了三个 NSTextFieldCell,其中第二个(有缺陷)是由我自己调用 drawWithFrame:inView: 绘制的,另外两个(正确)直接由运行时绘制。

任何想法我做错了什么?我觉得我正在传递正确的矩形(框架位于正确的位置),并且单个调用会产生正确的笔画(框架)和不正确的填充(背景)。这是一些配置错误的边框效果吗?我可以手绘我想要的效果,但如果我可以在这里修复我的方法,我宁愿坚持使用 NSTextFieldCell。

4

0 回答 0