Поведение автоматического изменения размера NSView
-
13-09-2019 - |
Вопрос
Мне нужно понять, как NSView автоматически изменяет размеры своих представлений.Я все настроил в IB, и размеры моих подпредставлений хорошо изменяются (когда я изменяю размер окна с помощью мыши).Однако, если я сделаю [myMainView setFrame:]
с моим новым прямоугольником кадра ничего не происходит.Все мои дополнительные представления по-прежнему имеют исходный размер (хотя основной вид имеет правильные размеры).Дети resizeWithOldSuperviewSize:
вызывается, но его размер все еще не соответствует размеру.
У меня есть экран, полный элементов какао (экран № 1), метка, изображение, видео.Для этих элементов имеется четко определенное расположение.Я настроил автоматическое изменение размера через Interface Builder, и это работает очень хорошо.Изменение размера главного окна меняет размеры элементов удовлетворительным образом.
Теперь пользователь нажимает кнопку «Далее», после чего должен быть нарисован второй экран с элементами (экран № 2).Мои макеты построены на основе канонического размера экрана (скажем, 800х600).Но теперь окно стало больше (или меньше), потому что его размер был изменен на экране №1.Таким образом, элементы теперь занимают лишь небольшую область в окне, вместо того, чтобы иметь соответствующий размер, чтобы заполнить доступное пространство.Я хочу масштабировать эти элементы.
Я неправильно понимаю, как работает автоматическое изменение размера?Как я могу вручную запустить механизм автоматического изменения размера под NSView?
Есть две вещи, которые я могу сделать:
- Вручную измените размер элементов в зависимости от текущего размера экрана относительно исходного размера.Этот вариант мне не нравится, потому что, похоже, мне приходится переписывать код, который уже работает в NSView (поведение автоматического изменения размера).
- Мой второй вариант — вызвать вышеупомянутую магию автоматического изменения размера NSView.Документация подразумевает, что [NSView setFrame:] сделает это за меня.Я попробовал изменить размер представления контента до исходного размера экрана (800x600), отобразить элементы, а затем изменить его размер до текущего размера окна.Концептуально, не идентично ли это изменению размера окна вручную?Кажется, это не так.Опять же, этот вариант предпочтительнее, поскольку он сводит к минимуму объем кода, который необходимо написать и поддерживать.
Решение 2
Оказывается, мой подход правильный.Я установил неправильное значение размера кадра, поэтому не получил ожидаемого поведения.Дох.
Другие советы
Этот код
NSView* superView = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
NSView* subView = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
[superView addSubview:subView];
[superView setAutoresizesSubviews:YES];
[subView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
NSLog(@"subview's frame before resizing: %@", NSStringFromRect([subView frame]));
[superView setFrame:NSMakeRect(0, 0, 200, 100)];
NSLog(@"subview's frame after resizing: %@", NSStringFromRect([subView frame]));
дает ожидаемый результат:
[...] subview's frame before resizing: {{0, 0}, {100, 100}} [...] subview's frame after resizing: {{0, 0}, {200, 100}}
Ваша проблема в другом.Я ожидаю, что одно из ваших представлений контейнера не является частью иерархии представлений окна в момент изменения размера.
Хорошим решением вашей проблемы может быть использование NSTabView без вкладок, потому что тогда все ваши представления всегда будут в окне (возможно, скрыты), а представление вкладок позаботится об изменении размера.
Другое решение — разместить несколько представлений друг над другом и использовать setHidden:
показать только один.