可以手动旋转UIPopoverController视图吗?

时间:2012-03-13 18:08:25

标签: objective-c ios cocoa-touch uikit uipopovercontroller

我的应用程序中的视图系统是高度自定义的,并使用许多视图,这些视图根据用户交互从纵向到横向手动旋转(通过将仿射变换应用于视图/图层来完成旋转)。

我想在这些旋转视图中的一个内部呈现弹出窗口,但是弹出窗口的方向总是相对于设备的方向(即,不相对于视图)出现。我猜答案是否定的,但万一有人有一个聪明的想法:有没有办法手动旋转UIPopoverController呈现的视图?

3 个答案:

答案 0 :(得分:1)

肖恩,我刚试过它来踢,是的。 必须在viewDidAppear中完成(至少在我的情况下)(如果在viewWillAppear中完成,它将被敲回原始设置。)

这个工作得很好(现在刚刚测试过),以90度的角度进行弹出。即在我的情况下,我的主视图是纵向模式,并且弹出窗口是90度。

self.navigationController.view.superview.superview.transform = CGAffineTransformMakeRotation (M_PI/2.0);

答案 1 :(得分:1)

您是要尝试旋转弹出窗口还是只显示弹出窗口中显示的内容?您可以通过设置可能的箭头方向来控制一些前者。我对后者感兴趣,它似乎只是通过抓住内容视图控制器。 。的 E.g

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

答案 2 :(得分:0)

免责声明:如果您对将应用程序放入商店感兴趣,此代码几乎肯定是拒绝的理由。它潜入了UIKit的私有API,就苹果而言,这是一个很大的禁忌。

@RunningPink有正确的想法。根据视图层次结构的设置方式,弹出窗口可能会比两个超级视图更远。 popover本身是(私有)类_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
}

在这样做的过程中,我发现转换视图通常会使弹出窗口变得模糊。我发现原因是popover的superview是另一个名为UIDimmingView的私有类的实例,它负责接受popover之外的触摸并导致popover被解雇。在调光视图上执行旋转消除了我在弹出窗口中看到的模糊。

然而,改变调光会导致窗户的某些部分没有被调光视图“遮盖”的怪异,因此如果窗口的这些部分被轻敲,则弹出窗口不会消失。为了解决这个问题,我将旋转应用到调光视图,重置调光视图的框架以覆盖屏幕,然后将弹出视图转换到位。

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];
}