drawRect未在添加的子视图上调用

时间:2009-09-26 11:42:54

标签: objective-c cocoa custom-controls nsview drawrect

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

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

但是,只要我尝试以编程方式将自定义NSTextField添加到contentView,就不会添加或绘制它。通过说自定义我的意思是我覆盖它的指定初始值设定项(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;
}

我已经花了几个小时的时间,所以任何指针都非常感激。可根据要求提供更多代码。)

2 个答案:

答案 0 :(得分:2)

你的-drawRect:覆盖对我来说似乎不对,为什么你会故意忽略传入的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];

答案 1 :(得分:2)

感谢您的回答!

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

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

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