Подтвердить что ты не робот

Подробное представление SplitView возвращает неверный ракурс?

Я использую приложение splitView в iPad. в представлении детали есть 2 subView в нем, которые рисуют себя в соответствии с ограничениями просмотра. проблема в том, что они всегда втягиваются (1024, 768), даже когда ipad находится в ландшафтном режиме.

BTW - если я вызываю тогда в портретном режиме, а затем поворачиваю ipad, они масштабируются до (706,768).

Я проверил фрейм представления и ограничения по мере его создания (в режиме просмотра был метод загрузки), и в обоих случаях я получаю следующее:

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

В окне отладки я получаю:

2011-03-03 10:58:19.376 English Club[63347:207] screen frame = {{0, 0}, {768, 1024}}
2011-03-03 10:58:19.382 English Club[63347:207] screen bounds = {{0, 0}, {768, 1024}}

Я не могу узнать, где проблема. Кто-нибудь может мне помочь?

Спасибо за любую помощь.

4b9b3361

Ответ 1

В viewDidLoad вид не должен иметь своего реального размера. Это будет установлено позже методами компоновки. Но это не должно вас остановить:) Как вы устанавливаете маску авторезистации? Если вы правильно настроили это, все должно быть в порядке.

Ответ 2

если вы ожидаете - (void) viewDidLayoutSubviews он будет иметь нужный размер

Ответ 3

Выполняйте операции в viewWillAppear вместо viewDidLoad.

Ответ 4

В настоящее время я пишу приложение UISplitViewController и был разочарован, узнав, что изменение размера детали или главного представления запрещено. Он полностью отвечает за размер этих подкадров.

Подобно UINavigationController и UITabBarController, UISplitViewController является контроллером вида "контейнер", и он формирует его подвид, чтобы соответствовать ему.

Функция self debugDumpTheFrames выводит кадр uisplitviewcontroller и два подкадра. Я печатаю кадры в представлении splitViewController viewDidLoad и устанавливаю таймер для вызова этой функции второй раз через 2 секунды (в течение которого я ничего не делаю):

[self debugDumpTheFrames];
NSTimer* timer = [NSTimer scheduledTimerWithTimeInterval:2.0f target:self selector:@selector(debugDumpTheFrames) userInfo:nil repeats:NO];

Если мы посмотрим на результат, мы увидим, что через некоторое время после viewdidload UISplitViewController изменил фреймы его субвью.

size of splitviewcontrollers view frame {{0, 0}, {748, 1024}}
size of splitviewcontrollers detail view frame {{0, 0}, {768, 1024}}
size of splitviewcontrollers master view frame {{0, 0}, {768, 1024}}

size of splitviewcontrollers view frame {{0, 0}, {748, 1024}}
size of splitviewcontrollers detail view frame {{321, 0}, {703, 748}}
size of splitviewcontrollers master view frame {{0, 0}, {320, 748}}

Где именно это изменение размера я не уверен; но uisplitviewcontroller является боссом этих фреймов, и они являются частными свойствами, поэтому трогать их является основанием для отказа от магазина.

Ответ 5

Да Если вы установили свойство Autoresizing, оно должно быть в порядке.

Вы можете установить их через nib или по коду

self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;

веселит...

Ответ 6

Если вам действительно нужно получить правильную ширину в viewDidLoad, вы можете получить доступ к контроллеру split view и получить ширину контроллера подробного представления.

например. в Swift:

func getDetailViewSize() -> CGSize {
    var detailViewController: UIViewController
    if (self.splitViewController?.viewControllers.count > 1) {
        detailViewController = self.splitViewController?.viewControllers[1] as! UIViewController
    } else {
        detailViewController = self.splitViewController?.viewControllers[0] as! UIViewController
    }
    return detailViewController.view.frame.size
}