Подробное представление 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}}
Я не могу узнать, где проблема. Кто-нибудь может мне помочь?
Спасибо за любую помощь.
Ответы
Ответ 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
}