2009-06-09 4 views
6

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

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

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

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

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

  1. вручную изменять размер элементов на основе текущего размера экрана по отношению к исходному размеру. Этот параметр не является моим фаворитом, потому что, по-видимому, я вынужден переписать код, который уже работает в NSView (поведение автоматического анализа
  2. Моим вторым вариантом является вызов вышеупомянутой магии авторазрешения NSView. Документация подразумевает, что [NSView setFrame:] будет сделайте это для меня. То, что я пробовал, изменил размер моего содержимого на исходный экран (800x600), визуализировал мои элементы, а затем изменил его размер до текущего размера окна. Концептуально ли это не идентично ручному изменению размера окна? видимому, не будет. Опять же, этот вариант является предпочтительным, поскольку он минимизирует объем кода, который тэ быть записан и сохранен.
+0

Try [resizeSubviewsWithOldSize:] (http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html#//apple_ref/occ/instm/NSView/resizeSubviewsWithOldSize :) или [setAutoresizesSubviews:] (http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html#//apple_ref/occ/instm/NSView/setAutoresizesSubviews :). –

+0

Я не уверен, что вы имеете в виду здесь. Вызывается resentSubviewsWithOldSize родителя, setAutoresizesSubviews имеет значение yes. Можете ли вы дать несколько советов? – EightyEight

+0

Первый из них - если autoresizesSubviews установлен в YES, то resizeSubviewsWithOldSize: должен получить вызов автоматически. Поскольку у вас есть это так, и это происходит, я тоже в тупике. Сожалею. –

ответ

3

Оказывается, мой подход правильный. Я устанавливал размер кадра на неправильное значение, поэтому я не получал ожидаемого поведения. Doh.

+6

Почему downvotes? – Chetan

+0

У меня такая же проблема. Больше предложений ... – Sunkas

20

Этот код

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

Другое решение - разместить несколько видов друг на друга и использовать setHidden:, чтобы показать только один.

+0

Это интересная идея, о том, чтобы сделать все виды. К сожалению, некоторые из видов требуют довольно много обработки, достаточно дорогостоящих. Отличная идея! – EightyEight

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

  • Нет связанных вопросов^_^