UIView и AutoresizingMask игнорируются
Первое сообщение о переполнении стека.
Я провел часы, просматривая многие поиски в Google, и практически запомнил справочные документы по классам UIView и UIViewController. Независимо от того, что я делаю, мое приложение игнорирует мои попытки изменить размеры моих взглядов на изменение ориентации (или любые другие изменения размера кадра в этом отношении).
Здесь нет ни перьев, ни перьев; Я строю все мои представления и контроллеры представлений программно, и все они (подконтрольные контроллеры) являются подклассами одного из трех пользовательских подклассов UIViewController, которые я создал. У этих суперклассов есть следующие строки в их loadView: метод...
[self setView:[[[UIView alloc] initWithFrame:[self viewFrame]] autorelease]];
[[self view] setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
[[self view] setAutoresizesSubviews:TRUE];
Во всех подходящих методах установки (куда бы я ни добавил subView другими словами) я повторяю шаги применения autoresizingMask. Кажется, что независимо от того, что я делаю, результат всегда один и тот же - я нажимаю "build", нажимаю "debug", жду запуска приложения, поворачиваю устройство и нажимаю "Presto"! Представление вращается, но не изменяет размер вообще.
Что мне здесь не хватает? Это, наверное, что-то очевидное, что я просто не вижу. Любая помощь действительно ценится, спасибо заранее.
1 ответ
Ну, конечно же, это была моя вина.
Урок номер один: вы не делаете себе одолжений, не ложитесь спать всю ночь, пытаясь исправить испорченный код. Отдохни! Пейте больше воды! Вероятно, вы только усугубите ситуацию, если будете продолжать пытаться заставить свой мозг выполнять сложную алгоритмическую стратегию и логику после его сна.
Оказывается, у меня был мошеннический UIView в нижней части иерархии представления, у которого вообще не было установлено свойство autoresize. Я думал, что я просмотрел все, но оказывается, что я пропустил один. (Всего один маленький обзор и целый день!)
Я могу сказать для любого, кто приходит позже с таким же разочарованием, что Autoresizing
действительно работает как задокументировано. Если вы думаете, что "что-то не вызывается", то вы, вероятно, смотрите не в том месте. Так же UIViewAutoresizingMask
Константы enum не используются точно так же, как в Interface Builder. В IB вы "блокируете" поля, тогда как при их программной настройке заблокированные поля предполагаются по умолчанию, а вы "разблокируете" их, устанавливая "Гибкие". Так, например, установка только битов FlexibleWidth и FlexibleHeight эквивалентна включению всех параметров автоматического изменения размера в IB. Бросая в любой из полей маски (т.е. UIViewAutoresizingFlexibleLeftMargin
) вы отменяете выбор соответствующей опции авторазмера маржи в IB. (Я видел много других сообщений, плавающих вокруг, где это, казалось, было главной точкой беспорядка для некоторых людей.)
Однако во время моего исследования я заметил, что, по-видимому, не происходит никакого события, сообщения, уведомления или чего-либо иного, когда размер UIView изменяется, автоматически или нет. Хотя это и не нужно для изменения размеров подвидов, было бы неплохо знать, когда это происходит в ситуации, когда вы хотите, чтобы scrollView или tableView прокручивались, если его размер кадра когда-либо изменится. Я знаю, что это легко сделать, когда клавиатура выскакивает, потому что вокруг нее есть система уведомлений, а также TextField
delegate
методы. Так что, возможно, тема для другого поста...
В любом случае, спасибо всем, кто участвует в Stackru!