2012-05-15 2 views
0

Итак, чтобы обрабатывать изменения ориентации (в представлении, а не контроллере), мы регистрируемся в уведомлении UIDeviceOrientationDidChange. Все хорошо.Как избежать «специального случая» при работе с подкачкой UIScrollView с OrientationDidChange при запуске приложения

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

После нескольких ненужных сообщений он начнет отправлять законные сообщения. Устройство сообщит правильную ориентацию «на», но оно все равно выдаст текущий фрейм (и границы), что является недопустимым.

Чтобы прокрутить страницу вправо, другие вопросы SO заставили меня забыть вручную установить contentOffset, у которого есть большая часть того, что мне нужно. currentPage = текущий сдвиг Y/ширина scrollview. Базовая математика, классная.

Это фиксированное большинство моих проблем. Для правильной OO, я дал свиток посмотреть функцию relayout, что не совсем размер IPad, так как это подвид, и в ней я делаю это:

float currentDeviceWidth = 768; 
float currentHeight = 949; //logging the frame from portrait, landscape = 1024 w, 693 h 
UIDeviceOrientation o = [[UIDevice currentDevice] orientation]; 
if (!UIDeviceOrientationIsPortrait(o)) { 
    //landscape 
    currentDeviceWidth = 1024; 
    currentHeight = 693; 
} 
else 
    NSLog(@"Moving to port, unless on startup, then its staying as"); 

который обрабатывает orientationDidChange: сообщения, но когда приложение запускается, вид прокрутки теперь меньше, чем должен быть, потому что он задает свой размер так, как будто границы, которые он получает, «собираются изменить», когда это не так.

Возможные решения: a) [self performSelector: @selector (relayout) withObject: nil afterDelay: delayNum];

б) дает задержку перед чем-то вроде «BOOL dontIgnoreLayout» постановки/снятия

с) Найдите другой способ проверки для ориентации

г) вручную пойти и выяснить, что вызывает все сообщения, которые должны быть отправлены изначально, удалить все причины - эта опция возможна только в том случае, если она не создана системой при загрузке. Я могу проверить это с помощью нового проекта за секунду, хотя это приложение для предприятия, может потребоваться некоторое копирование, если это так.

Удивление, если кто-нибудь решит это. Если нет, я должен ввести код «специальный случай» или «время», ни один из которых не является стилем OO, по крайней мере, не моим предпочтительным способом (и моими коллегами).

Если я что-то пропустил, дайте мне знать, но, как вы можете видеть, я нашел несколько ответов до сих пор.

Благодаря

+0

http://stackoverflow.com/questions/5810397/status-bar-is-landscape-but-uiapplication-sharedapplication-statusbarorienta может иметь обходное решение или так ... узнает. Кроме того, проверенная начальная загрузка, получает ложные сообщения при запуске с новым проектом –

ответ

0

Я последовал примеры других людей путем проверки строки состояния ориентации вместо этого, это, казалось бы, всегда прав, и показывает противоречивые сообщения с UIDevice currentOrientation ... Я знаю, что это было установлено ранее, но конкретная причина этого исправлена ​​проблема:

Согласно рекомендациям в других тонах, я зарегистрировался на уведомления в ViewDidAppear, а не на viewDidLoad, эта комбинация кажется победой.

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