Я боролся с этой же проблемой в течение некоторого времени и нашел неуклюжий обходной путь. Перед моим решением еще немного предыстории о препятствиях:
- В iPhone OS координаты корневого представления всегда находятся в буквальных фиксированных координатах физического экрана. «Вверх» - это всегда устройство вверх. Подвиды должны получить координаты, которые были преобразованы в заданную ориентацию, так что «Вверх» - это то, что мы ожидаем: гравитация вверх.
- Для размещения UIView в верхней части иерархии представлений (над UIScrollView) потребуется выполнить эти преобразования самостоятельно во время событий ориентации. Вы получаете полноэкранный режим, но теряете преимущество scrollView, управляющего координатами ориентации для ваших подпредставлений.
- Сохраняя свой вид в scrollView, нет простого способа, как в Mac OS, просто свернуть панель splitView. Просмотр заголовочного файла показывает некоторые частные методы экземпляров, используемые для управления шириной.
Итак, я думаю, что вы можете поддерживать два «ориентированных на ориентацию» контроллера представления (один splitView, один полноэкранный режим), переключать их и перемещать вид между ними при переключении в полноэкранный режим. Я не пошел по этому пути, так как это, очевидно, сложная иерархия памяти и представлений.
Что я делаю, так это переключаюсь между «почти полноэкранной» шириной для основного вида и обычной шириной разделения. Это прекрасно работает, за исключением того, что закругленные углы splitView на самом деле являются жестко закодированными изображениями, которые рисуются независимо от размеров splitView. Вы увидите эти крошечные черные круглые углы 100% времени. Вот эффект:
- (IBAction)toggleFullscreen:(id)sender; {
id appDelegate = [[UIApplication sharedApplication] delegate];
UISplitViewController *split = [appDelegate splitViewController];
//get master and detail view controller
UIViewController *master = [split.viewControllers objectAtIndex:0];
UIViewController *detail = [split.viewControllers objectAtIndex:1];
//In landscape permit fullscreen
if(self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
self.interfaceOrientation == UIInterfaceOrientationLandscapeRight) {
CGRect f = detail.view.frame;
if ( f.origin.x == 0 ) { //exiting fullscreen
[sender setImage:[UIImage imageNamed:@"SlideLeft.png"]];
//adjust detail view
f.size.width = 703;
f.origin.x = 321;
[detail.view setFrame:f];
//adjust master view
f = master.view.frame;
f.size.width = 320;
f.origin.x = 0;
[master.view setFrame:f];
} else { //entering fullscreen
[sender setImage:[UIImage imageNamed:@"SlideRight.png"]];
//adjust detail view
f.size.width = 1024;
f.origin.x = 0;
[detail.view setFrame:f];
//adjust master view
f = master.view.frame;
f.size.width = 1;
f.origin.x = -1;
[master.view setFrame:f];
}
}
}
Я получил много этого кода отсюда и из других источников, но, насколько я знаю, эта реализация уникальна. Возможно, потому что это несовершенно.