0

我正在尝试以编程方式创建一个带有自定义contentView和一个自定义控件的窗口NSTextField,但是我无法让这种窗口和视图的层次结构自行绘制。

我创建了一个自定义无边框窗口并覆盖它的setContentView/contentView访问器。这似乎工作正常,自定义 contentViewinitWithFramedrawRect方法被调用,导致 contentView 正确绘制自己。

但是,一旦我尝试以编程方式添加自定义NSTextFieldcontentView它就不会被添加或绘制。通过说自定义,我的意思是我覆盖了它的指定初始化程序(initWithFrame:frame- 仅用于自定义字体设置)和 drawRect 方法,如下所示:

- (void)drawRect:(NSRect)rect {
    NSRect bounds = [self bounds];
    [super drawRect:bounds];
}

自定义 contentView 的初始化程序如下所示:

- (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    if (self != nil) {
      // i want to draw itself to the same 
      // size as contentView thus i'm using same frame
      CustomTextField *textField = [[CustomTextField alloc] initWithFrame:frame];
      [self addSubview:textField];
      [self setNeedsDisplay:YES];
    }
    return self;
}

我已经为此苦苦挣扎了几个小时,因此非常感谢任何指针。更多代码可根据要求提供。)

4

2 回答 2

2

您的 -drawRect: override 对我来说似乎是错误的,您为什么要故意忽略传入的 rect 参数?为什么这是必要的?

至于为什么没有出现文本字段,很可能是因为你没有配置它。当您在代码中创建一个 NSTextField 时,您不会获得与将文本字段拖到 IB 中的视图上时获得的默认实例相同的东西。您将需要配置 NSTextField 及其 NSTextFieldCell 以获得您想要的外观。

我正在使用这样配置的以编程方式添加的文本字段:

_textField = [[NSTextField alloc] initWithFrame:textFieldRect];
[[_textField cell] setControlSize:NSSmallControlSize];
[_textField setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
[_textField setBezelStyle:NSTextFieldSquareBezel];
[_textField setDrawsBackground:YES];
[_textField setBordered:YES];
[_textField setImportsGraphics:NO];
[_textField setAllowsEditingTextAttributes:NO];
[_textField setBezeled:YES];
[_textField sizeToFit];
[self addSubview:_textField];
[_textField setFrame:textFieldRect];
[_textField setAutoresizingMask:NSViewMinXMargin];
于 2009-09-27T01:58:55.490 回答
2

感谢您的回答!

我发现了我自己的问题。没有调用 drawRect 的原因是因为自定义文本字段是在内容视图的框架之外绘制的。我想我忘了提到我正在以屏幕为中心绘制窗口的关键细节,因此它的框架带有 x/y 偏移。

为了用它的内容视图填充窗口,我用与窗口相同的框架初始化 contentView(意味着与窗口的 (0;0) 点相同的 (x;y) 偏移量)。

现在我无法写入自定义文本字段,但这是我认为我能够处理的另一个问题。

于 2009-09-27T06:10:31.283 回答