Раскадровка, NavigationController, альбомная ориентация и координата прокрутки

Я столкнулся с проблемой, вызванной магией ориентации, которую я не понимаю. Во-первых, я использую NavigationController, который загружает ViewController. В этом ViewController есть ScrollView. Когда я запрашиваю положение ScrollView, я получаю неправильные данные. Например: координата x ScrollView равна 90 в построителе интерфейса. Если я программно получаю кадр ScrollView, он возвращает 280. Все в приложении настроено на альбомную ориентацию. В Info.plist, в сводке, в реализации ViewController'ов, в построителе интерфейса.

Я сделал несколько скриншотов. Может быть, они помогают найти ошибку.

Настройки в сводке

Frame в конструкторе интерфейса ScrollView

Фрейм в реализации, где бар отличается от построителя интерфейса

Настройки ViewController, содержащие ScrollView

И у каждого ViewController есть это:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}

Если я удалю NavigationController из раскадровки и оставлю смоделированные метрики предполагаемыми, то первый ViewController переключится на портрет в раскадровке.

Когда я регистрирую размер представления из NavigationController, он находится в портретной ориентации.

NSLog(@"frame %@", NSStringFromCGRect(self.view.frame));

Выход 768x1024


person zeiteisen    schedule 21.08.2012    source источник
comment
Итак, вы хотите, чтобы он был привязан к альбомной ориентации?   -  person FaddishWorm    schedule 21.08.2012
comment
Вы пытались реализовать все настройки scrollView в методе viewWillApper:animated:?   -  person The iOSDev    schedule 21.08.2012
comment
@FaddishWorm, да, это всего лишь пейзаж, и проблема не в этом. Рамки взглядов испорчены.   -  person zeiteisen    schedule 21.08.2012
comment
@AalokParikh, это решает проблему. Спасибо!   -  person zeiteisen    schedule 21.08.2012
comment
@zeiteisen Я разместил свой комментарий в качестве ответа. Пожалуйста, примите это как принятый ответ :)   -  person The iOSDev    schedule 21.08.2012


Ответы (2)


Проблема заключается в используемом методе, т.е. методе viewDidLoad:. В это время никакие подпредставления еще не нарисованы, и никакие кадры еще не инициализированы, поэтому проблема заключается в согласии.

Вместо использования viewDidLoad: используйте viewWillAppear:animated: или viewDidAppear:animated:, чтобы решить проблему за вас.

Удачного кодирования :)

person The iOSDev    schedule 21.08.2012

Я думал, что вам обычно приходится учитывать ориентацию, когда вы вычисляете x вне кадра, поэтому у них есть преобразования? iPhone SDK: ориентация (альбомная и книжная ориентация)

Простой запрос кадра для значения X не всегда даст вам точные результаты.

person FaddishWorm    schedule 21.08.2012