UIView и AutoresizingMask игнорируются - PullRequest
8 голосов
/ 18 сентября 2010

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

Я провел часы, просматривая многие поиски в 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 Ответ

33 голосов
/ 19 сентября 2010

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

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

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

Я могу сказать для любого, кто придет позже с подобным разочарованием, что Autoresizing действительно работает как задокументировано.Если вы думаете, что «что-то не вызывается», то вы, вероятно, смотрите не в том месте.Кроме того, константы перечисления UIViewAutoresizingMask не используются точно так же, как в Интерфейсном Разработчике.В IB вы «блокируете» поля, тогда как при их программной настройке заблокированные поля предполагаются по умолчанию, и вы «разблокируете» их, устанавливая «Гибкие».Так, например, установка только битов FlexibleWidth и FlexibleHeight эквивалентна включению всех параметров автоматического изменения размера в IB.Прибрасывая любую из масок полей (например, UIViewAutoresizingFlexibleLeftMargin), вы «отменяете выбор» соответствующей опции автоматического изменения размера полей в IB.(Я видел много других сообщений, плавающих вокруг, где это, казалось, было главной точкой беспорядка для некоторых людей.)

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

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

...