presentPopoverFromRect在旋转时向侧面显示弹出窗口

时间:2012-05-07 16:39:28

标签: objective-c ipad uialertview uipopovercontroller screen-rotation

- 我有一个UIView - 这个UIView有一个UIButton,当点击时会出现UIAlertView - 在这个UIAlertView中我有另一个UIButton,点击时调用buttonClicked:
- 在这个buttonClicked:方法中,我使用自定义视图调用presentPopoverFromRect。 (hourKeyboard是自定义视图)

-(void)buttonClicked:(id)sender
{
    if(self.hourKeyboard==nil)
    {
        self.hourKeyboard = [[HourKeyboardViewController alloc] init];
        self.hourKeyboardPopover = [[UIPopoverController alloc] initWithContentViewController:self.hourKeyboard];
    }

    [self.hourKeyboardPopover presentPopoverFromRect:[sender bounds] inView:sender permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
}

在普通人像模式下,效果很好。弹出窗口仅在按钮右侧产生,箭头正确指向按钮。

有两个问题: 1)当此弹出窗口可见时,当您旋转屏幕时,弹出窗口稍微不正确地旋转(它不会重新定位它自己的x和y位置)
2)如果没有显示弹出窗口。如果你旋转屏幕,然后调用“buttonClicked”,弹出窗口将出现,但是,它会在按钮上方显示,箭头指向“向下”按钮(技术上相对于侧面弹出视图)。如果您将其关闭,旋转屏幕,然后调用“buttonClicked”,弹出窗口现在显示为倒置,按钮指向“按钮”(再次,技术上相对于侧面弹出视图)!重复使其再次侧向,然后再向右侧。

- = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = -

我的想法:

1)我相信我可以重新定位x和y,但是,我也读过你应该解除弹出并在旋转时再次显示它。我会看看我是否可以让第一个工作,但是我更关心第二个问题。

2)我不知道如何解决这个轮换问题。看起来当你旋转到横向而没有可见的弹出窗口。然后你调用presentPopoverFromRect,用iPad创建弹出框,认为它仍然是纵向视图。这是它给出的行为,但是,我不确定如何让iPad不犯这个错误。

- = - = - = - = - = - = - = - = - =

再次感谢您提供的任何帮助!

- = - = -

轻微更新:
1)很容易从旋转主视图中解除弹出窗口。这似乎是每个人处理这个问题的一般方式。

2)尝试各种各样的事情,比如改变框架,使用CGAffineTransformMakeRotation等等......但到目前为止没有运气

- = - = -

另一个更新:

2)经过大量测试后,它似乎是UIAlertView的直接问题。如果我将视图放在UIAlertView(当前正在进行)中,则AlertView不会告诉popover屏幕被旋转......从而产生问题

看起来修复此问题的唯一方法是完全删除UIAlertView。我将手动禁用各种背景视图(如Alert View正在执行的操作),而不是显示UIAlertView,然后显示一个看起来类似于AlertView的自定义UIView。从那里,我应该能够毫无问题地展示popover。我会让你知道结果如何。

- = - = - = - = - = - = - = -

最终解决方案:

我最终只创建了自己的视图,并让该视图模仿了UIAlertView。然后,当我生成popover时,我将它放在根视图控制器中。工作得更好,但需要更多工作,因为我不得不手动创建自己的View而不是预制的UIAlertView。无论哪种方式,显然UIAlertView无法告诉UIPopoverover子视图它在哪个轮换。

1 个答案:

答案 0 :(得分:1)

取消willRotateToInterfaceOrientation中的popover并再次在didRotateFromInterfaceOrientation中显示。

没有任何问题。

编辑: 对不起,我误解了你的第二个问题。

如果视图层次结构的某些部分显示方向错误,则其中一个控制器可能缺少shouldAutorotateToInterfaceOrientation方法。