Можно вручную повернуть вид UIPopoverController? - PullRequest
1 голос
/ 13 марта 2012

Система представлений в моем приложении сильно настроена и использует ряд представлений, которые вручную поворачиваются из портретного в ландшафтное на основе взаимодействия с пользователем (вращение выполняется путем применения аффинного преобразования к виду / слою).

Я хочу представить всплывающее окно внутри одного из этих повернутых видов, но ориентация всплывающего окна всегда отображается относительно ориентации устройства (т. Е. Не относительно вида).Я предполагаю, что ответ - нет, но на всякий случай, если у кого-то есть умная идея: есть ли способ вручную повернуть представление, представленное UIPopoverController?

Ответы [ 3 ]

1 голос
/ 04 ноября 2012

Вы пытаетесь вращать поповер или просто содержимое, отображаемое в поповере? Вы можете управлять некоторыми из первых, устанавливая, какие ориентации стрелок возможны. Я заинтересован в последнем, и это, кажется, работает, просто захватывая контроллер представления контента. * 1002 Е.Г. *:

aPopoverController.contentViewController.view.transform = CGAffineTransformMakeRotation(M_PI);

1 голос
/ 13 марта 2012

Шон, я только что проверил его на удары, да, это работает. Это должно быть сделано (по крайней мере, в моем случае) в viewDidAppear (если сделано в viewWillAppear, оно возвращается к исходной настройке.)

Это работало очень хорошо (только что протестировано), чтобы получить поповер под углом 90 градусов. т.е. в моем случае мой основной вид находится в портретном режиме, а поповер повернут на 90 градусов.

self.navigationController.view.superview.superview.transform = CGAffineTransformMakeRotation (M_PI/2.0);
0 голосов
/ 15 марта 2012

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Если вы вообще заинтересованы в том, чтобы доставить ваше приложение в магазин, этот код почти наверняка является основанием для отклонения.Он погружается в закрытый API UIKit, который является большим нет-нет, поскольку это касается Apple.

@ RunningPink была правильной идеей.В зависимости от того, как настроена иерархия представления, всплывающее окно может копироваться дальше, чем два суперпредставления.Сам поповер это экземпляр (приватного) класса _UIPopover (по крайней мере в iOS 5).Вы можете найти этот вид, выполнив:

UIView *possiblePopover = popoverController.contentViewController.view;
while (possiblePopover != nil) {
    // Climb up the view hierarchy
    possiblePopover = possiblePopover.superview;
    if ( [NSStringFromClass([possiblePopover class]) isEqualToString:@"_UIPopoverView"] ) {
        // We found the popover, break out of the loop
        break;
    }
}

if (nil != possiblePopover) {
    // Do whatever you want with the popover
}

При этом я обнаружил, что преобразование вида часто заканчивалось тем, что поповер выглядел размытым.Я обнаружил, что причина была в том, что супервидение поповера было экземпляром другого частного класса с именем UIDimmingView, который отвечает за принятие прикосновений за пределами поповера и вызывает его отклонение.Выполнение поворота в режиме затемнения убрало размытие, которое я видел во всплывающем окне.

Однако преобразование затемнения может привести к странностям, когда определенные части окна не «покрываются» видом затемнения, поэтому всплывающее окноне будет уволен, если эти части окна постукивают.Чтобы обойти это, я применил вращение к представлению затемнения, сбросил рамку представления затемнения, чтобы покрыть экран, а затем перевел всплывающее представление на место.

if (nil != possiblePopover) {
    // Found the popover view
    CGAffineTransform rotation = CGAffineTransformMakeRotation(-M_PI_2);
    CGAffineTransform translation = // Whatever translation in necessary here

    // Rotate the UIDimming View and reset its frame
    [possiblePopover.superview setTransform:rotation];
    [possiblePopover.superview setFrame:CGRectMake(0, 0, possiblePopover.superview.frame.size.height, possiblePopover.superview.frame.size.width)];

    // Translate the popover view
    [possiblePopover setTransform:translation];
}
...