UIView и AutoresizingMask игнорируются

Первая публикация при переполнении стека.

Я потратил несколько часов на поиск многих поисковых запросов Google и на данный момент практически запомнил справочные документы класса UIView и UIViewController. Независимо от того, что я делаю, мое приложение игнорирует мои попытки изменить размеры моих взглядов на изменение ориентации (или любые другие изменения размера кадра, если на то пошло.)

В нем нет нибов или xibs; Я создаю все свои представления и viewcontrollers программно, и они (viewcontrollers) - все подклассы одного из трех пользовательских подклассов UIViewController, которые я создал. Эти суперклассы имеют следующие строки в свой loadView: метод...

[self setView:[[[UIView alloc] initWithFrame:[self viewFrame]] autorelease]];
[[self view] setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
[[self view] setAutoresizesSubviews:TRUE];

Во всех соответствующих методах настройки (везде, где я добавляю subView другими словами), я повторяю шаги применения метода autoresizingMask. Кажется, что независимо от того, что я делаю, результат всегда один и тот же - я нажимаю build, щелкаю debug, жду, когда приложение запустится, поверните устройство и престо! Вид вращается, но не изменяется вообще.

Что мне здесь не хватает? Возможно, что-то очевидное, что я просто не вижу. Любая помощь действительно оценена, спасибо заранее.

Ответ 1

Ну, конечно, это была моя собственная ошибка.

Урок номер один:. Вы не делаете себе никаких выгод, не спать всю ночь, пытаясь исправить сломанный код. Отдохни! Пейте больше воды! Вы, вероятно, только усугубите ситуацию, если будете пытаться заставить свой мозг выполнить сложную алгоритмическую стратегию и логику за ее постель.

Оказывается, у меня был мошенник UIView в нижней части иерархии представлений, у которого вообще не было свойства autoresize. Я думал, что просмотрел все, но оказывается, что я его пропустил. (Только один маленький взгляд, и целый день выстрелил!)

Я могу сказать всем, кто приходит позже с подобным расстройством, что Autoresizing действительно работает как задокументированный. Если вы думаете, что "что-то не называется", вы, вероятно, смотрите не в то место. Кроме того, константы enum UIViewAutoresizingMask не используются точно так же, как в Interface Builder. В IB вы "блокируете" поля, тогда как при их программном программировании блокированные поля принимаются по умолчанию, и вы "разблокируете" их, установив его как "гибкий". Так, например, установка только битов FlexibleWidth и FlexibleHeight эквивалентна включению всех параметров авторазрешения в IB. Выбрасывая любую из масок поля (т.е. UIViewAutoresizingFlexibleLeftMargin), вы "отменяете" соответствующий параметр авторезизации поля в IB. (Я видел много других сообщений, плавающих вокруг, где это, казалось, было основной точкой смятения для некоторых людей.)

Во время моих исследований, однако, я заметил, что при изменении размера UIView, независимо от того, автоматически или нет, не возникает какого-либо события, сообщения, уведомления или другого. Хотя это не обязательно для изменения размера подпроектов, было бы неплохо узнать, когда это происходит в ситуации, когда вы хотите вызвать прокрутку scrollView или tableView, если он изменит размер кадра. Я знаю, что это можно легко сделать, когда клавиатура всплывает, потому что вокруг нее есть система уведомлений, а также методы TextField delegate. Так что, может быть, тема для другого сообщения...

В любом случае, спасибо всем, кто участвует в StackOverflow!