Поведение автоматического изменения размера NSView

StackOverflow https://stackoverflow.com/questions/967625

Вопрос

Мне нужно понять, как NSView автоматически изменяет размеры своих представлений.Я все настроил в IB, и размеры моих подпредставлений хорошо изменяются (когда я изменяю размер окна с помощью мыши).Однако, если я сделаю [myMainView setFrame:] с моим новым прямоугольником кадра ничего не происходит.Все мои дополнительные представления по-прежнему имеют исходный размер (хотя основной вид имеет правильные размеры).Дети resizeWithOldSuperviewSize: вызывается, но его размер все еще не соответствует размеру.

У меня есть экран, полный элементов какао (экран № 1), метка, изображение, видео.Для этих элементов имеется четко определенное расположение.Я настроил автоматическое изменение размера через Interface Builder, и это работает очень хорошо.Изменение размера главного окна меняет размеры элементов удовлетворительным образом.

Теперь пользователь нажимает кнопку «Далее», после чего должен быть нарисован второй экран с элементами (экран № 2).Мои макеты построены на основе канонического размера экрана (скажем, 800х600).Но теперь окно стало больше (или меньше), потому что его размер был изменен на экране №1.Таким образом, элементы теперь занимают лишь небольшую область в окне, вместо того, чтобы иметь соответствующий размер, чтобы заполнить доступное пространство.Я хочу масштабировать эти элементы.

Я неправильно понимаю, как работает автоматическое изменение размера?Как я могу вручную запустить механизм автоматического изменения размера под NSView?

Есть две вещи, которые я могу сделать:

  1. Вручную измените размер элементов в зависимости от текущего размера экрана относительно исходного размера.Этот вариант мне не нравится, потому что, похоже, мне приходится переписывать код, который уже работает в NSView (поведение автоматического изменения размера).
  2. Мой второй вариант — вызвать вышеупомянутую магию автоматического изменения размера 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: показать только один.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top