Подробное представление SplitView возвращает неправильную рамку вида? - PullRequest
18 голосов
/ 03 марта 2011

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

Кстати - если я позвоню, то в портретном режиме, а затем поверните 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}}

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

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

Ответы [ 6 ]

6 голосов
/ 29 октября 2011

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

4 голосов
/ 24 апреля 2014

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

3 голосов
/ 02 декабря 2012

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

2 голосов
/ 16 декабря 2011

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

Как и UINavigationController и UITabBarController, UISplitViewController является контроллером представления «контейнер» и формирует свои подпредставления в соответствии со своими целями.

Функция self debugDumpTheFrames распечатывает кадр контроллера uisplitview и его два подкадра. Я печатаю кадры в viewDidLoad splitViewController и устанавливаю таймер для повторного вызова этой функции через 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 является боссом этих фреймов, и они являются частной собственностью, поэтому касание их является основанием для отказа от магазина.

1 голос
/ 12 декабря 2011

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

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

self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;

веселит ...

0 голосов
/ 22 апреля 2015

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

Например, в 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
}
...