Фактический размер NSView Self

Я только начал новый проект GrafLab Laboratory, чтобы поэкспериментировать с рисованием в NSView. Я добавил пользовательский вид в главное окно и настроил его так, чтобы он соответствовал размеру, когда окно меняет свой размер.

Я изменил свой InitFrameWith к этому:

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        NSRect r = [self bounds];
    }

    return self;
}

Когда я запускаю свое новое приложение в первый раз и запрашиваю [собственные границы], я получаю правильное значение: {{0, 50}, {600, 450}}. Затем я изменяю размер окна, перетаскивая мышью. При перезапуске моего приложения initWithFrame возвращает то же значение: {{0, 50}, {600, 450}}.

Но я новый изменил размер. Я уже попробовал несколько вещей, но безуспешно.

Любые подсказки, что я делаю не так?

Спасибо Рональд

1 ответ

Решение

InitWithFrame имеет значение только при инициализации объекта в кадре.

Если это пользовательский UIView с пользовательским рисунком, тогда посмотрите на:

- (void)drawRect:(NSRect)frame

Это будет вызвано при вызове setNeedsDisplay и / или изменении размера представления.

В некоторых пользовательских представлениях в initWithFrame я установил маски авторазмера:

    // subviews autoresize
    [self setAutoresizesSubviews:YES];   
    // set resize masks (springs)
    [self setAutoresizingMask:(NSViewMaxXMargin | NSViewMinXMargin |
                              NSViewMaxYMargin | NSViewMinYMargin |
                              NSViewHeightSizable | NSViewWidthSizable)];

Затем в init и drawRect я вызываю метод layoutViews, если прямоугольник изменился:

- (void)drawRect:(NSRect)frame {
    ...
    // called on resize.  on init, delegate isn't hooked up so we'll skip
    if (!NSEqualRects(_prevRect, [self bounds]))
    {
        [self layoutViews];
    }

    // stash away rect for comparison so layout view code only happens when the rect changes
    _prevRect = [self bounds];

Мой layoutViews имеет собственную логику макета.

Надеюсь, это поможет.

Другие вопросы по тегам