Я боролся с этой же проблемой в течение некоторого времени и придумал неуклюжий обходной путь. Перед моим решением еще немного информации о препятствиях:
- В 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];
}
}
}
Я получил много этого кода отсюда и из других источников, но, насколько мне известно, эта реализация уникальна. Наверное, потому что он несовершенен.
person
SG1
schedule
03.06.2010