То, что вы видите на экране вашего iPhone, почти всегда представляет собой иерархию представлений.
Когда вы смотрите, скажем, свой почтовый ящик в Mail, вы видите кучу просмотров. Есть большое сдерживающее представление. [1] В этом есть представление панели навигации, представление таблицы и представление панели инструментов. Внутри панели навигации есть вид кнопки с каждой стороны и вид метки посередине. Внутри табличного представления есть несколько представлений ячеек таблицы, и каждая из этих ячеек имеет несколько представлений меток. Панель инструментов имеет пять видов кнопок. Я мог бы пойти дальше и поговорить о видах внутри этих кнопок и так далее, но я уверен, что вы поняли идею.
Представление выше любого данного представления является его суперпредставлением; взгляды под ним - это его подвиды. Таким образом, представление ячейки таблицы имеет табличное представление в качестве суперпредставления и набор меток в качестве подпредставлений. Вид сверху, который имеет все остальные виды внутри, называется корневым видом.
Каждый вид имеет свою собственную поверхность для рисования. Прямоугольник, образованный этой поверхностью рисования, называется рамкой. Фрейм представления относится к кадру содержащего его представления. Таким образом, если у одного из подпредставлений метки в ячейке таблицы есть рамка (0,0), это означает, что она будет в верхнем левом углу ячейки таблицы, даже если ячейка находится на полпути вниз по экрану.
Когда вы пишете контроллер вида, self.view
- это тот корневой вид, который я упоминал ранее; все остальные представления являются подпредставлениями этого (или подпредставлениями его подпредставлений и т. д.). Одной из особенностей контроллера представления является то, что он автоматически изменяет свой self.view
, чтобы соответствовать экрану. (Доступная область будет меньше в середине телефонного звонка: строка состояния будет в два раза выше, поэтому места для вашего приложения будет меньше. Она также будет меньше, если ваш контроллер представления управляется контроллером навигации или вкладкой Контроллер панели, но это уже другая история.) Но только то, что вы изменили размер его корневого представления, не означает, что подпредставления корневого представления будут автоматически изменяться. Для этого вам нужно установить их маску авторазмера (свойство, которое сообщает представлению, как оно должно реагировать, когда его суперпредставление изменяет размер):
someView.autoresizingMask = UIViewAutoresizingFlexibleWidth
| UIViewAutoresizingFlexibleHeight;
(Существует графический способ настройки маски авторазмера в Интерфейсном Разработчике - щелкните значок линейки в окне инспектора и посмотрите раздел «Авторазмер».)
Даже этого недостаточно, если someView
не подходит для начала. Для этого настройте его кадр, прежде чем добавить его в качестве подпредставления self.view
:
someView.frame = CGRectMake(
0, // all the way to the left
0, // all the way at the top
self.view.frame.size.width, // same width as the root view
self.view.frame.size.height, // same height too
);
Так зачем вам когда-либо использовать подпредставления, если вам приходится делать все это, что делает для вас корневое представление? Просто: у вас может быть только одно корневое представление, но одного представления почти никогда не достаточно для того, что вам нужно сделать. Если вам действительно нужен только один вид, конечно, вы можете просто установить его в качестве корневого и продолжить свой веселый путь, но, скорее всего, все будет сложнее.
[1] Я немного упрощаю здесь, но сейчас это нормально.