Рекомендуемый способ перехода в полноэкранный режим

Я хочу, чтобы UIView занимал весь экран, чтобы время от времени отображать изображение, но большую часть времени я использую UISplitViewController для основных функций приложения. Есть ли рекомендуемый/лучший способ сделать это? Прямо сейчас у меня есть указатель на главное окно, и я просто добавляю UIView в качестве дополнительного представления и выношу его на передний план, но он не будет отображаться в правильной ориентации. Мне просто интересно, есть ли лучший способ/что-то простое, чего мне не хватает.

Спасибо.


person Matt Long    schedule 02.06.2010    source источник


Ответы (2)


Я боролся с этой же проблемой в течение некоторого времени и придумал неуклюжий обходной путь. Перед моим решением еще немного информации о препятствиях:

  • В 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
comment
Спасибо за ваш отзыв об этом. Я действительно сделал что-то подобное. Я просто надеялся, что есть более простой (с меньшим количеством кода) способ реализовать это. Вы смотрели -setWantsFullScreenLayout на UIViewController? Кажется, что-то там есть, но когда я использую это, что-то все еще испорчено, поскольку вид отображается в портретной ориентации, хотя я нахожусь в альбомной ориентации. Это раздражает, но я уверен, что просто делаю это неправильно. ;-) - person Matt Long; 04.06.2010
comment
Из того, что я читал, этот метод влияет только на то, отображается ли черная строка состояния или нет. Это неправильное название «хочет полный экран»; это должно называться показывает строку состояния. - person SG1; 04.06.2010

В итоге я использовал контроллер модального представления, который я представляю из контроллера разделенного представления. Затем я указываю разрешенные ориентации в -shouldAutorotateToInterfaceOrientation. Я также скрываю строку состояния. Это работает для моих нужд.

person Matt Long    schedule 12.07.2010