我的应用程序中的视图系统是高度自定义的,并使用许多视图,这些视图根据用户交互从纵向到横向手动旋转(通过将仿射变换应用于视图/图层来完成旋转)。
我想在这些旋转视图中的一个内部呈现弹出窗口,但是弹出窗口的方向总是相对于设备的方向(即,不相对于视图)出现。我猜答案是否定的,但万一有人有一个聪明的想法:有没有办法手动旋转UIPopoverController呈现的视图?
答案 0 :(得分:1)
这个工作得很好(现在刚刚测试过),以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];
}