Фактический размер 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 имеет собственную логику макета.
Надеюсь, это поможет.