2009-09-26 5 views
0

Я пытаюсь программно создать окно с настраиваемым contentView и одним настраиваемым элементом управления NSTextField, но у меня возникли проблемы с получением этой иерархии окна и представлений.drawRect не вызывается при добавлении subview

Я создаю пользовательское окно без полей и переопределяю его setContentView/contentView accessors. Кажется, что это работает нормально, и настраиваемые методы contentView's initWithFrame и drawRect вызываются, заставляя 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

Спасибо за ваши ответы!

Я нашел свою проблему. Причина, по которой drawRect не вызывалась, заключается в том, что пользовательское текстовое поле было нарисовано за пределами - рамка просмотра содержимого. Наверное, я забыл упомянуть важную деталь, что я рисую окно, центрированное на экране, таким образом, это кадр с смещением x/y.

Чтобы заполнить окно его содержимым, я инициализирую контент с тем же фреймом, что и окно (что означает то же (x; y) смещение от точки окна (0; 0)).

Теперь я просто не могу написать пользовательское текстовое поле, но это еще одна проблема, я думаю, что смогу обработать.

2

Ваш -drawRect: переопределение кажется мне неправильным, почему вы намеренно игнорируете переданный аргумент? Почему это необходимо?

Что касается того, почему текстовое поле не отображается, это, скорее всего, потому, что вы его не настроили. Когда вы создаете 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

Ну, я даже не пытался переопределить метод drawRect или просто рисовать черный прямоугольник. Причина, по которой я игнорирую параметр 'rect', заключается в том, что он определяет только область, которую нужно перерисовать. Например, когда курсор на текстовом поле мигает - OS отправляет drawRect с сообщением с параметром rect, который определяет только область этого курсора. Спасибо за ваш совет, я постараюсь следовать ему. – Eimantas

Смежные вопросы