UIPopOver和方向更改

时间:2010-06-09 17:58:38

标签: ipad uipopovercontroller

在我的应用程序中,我有3个UIPopOvers。当用户点击工具栏中的按钮时,它们会出现。如果弹出窗口已经打开(例如-willAnimateRotationToInterfaceOrientation :),我需要在用户旋转iPad时使弹出框出现在正确的位置。

我该怎么做?

提前致谢!

9 个答案:

答案 0 :(得分:10)

在iOS 7.0及更高版本中,可以通过实施UIPopoverControllerDelegate中提供的以下方法来完成:

(void)popoverController:(UIPopoverController *)popoverController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView **)view

对于使用 presentPopoverFromRect 方法呈现的弹出框,当界面方向更改时,弹出控制器会调用此方法。

答案 1 :(得分:6)

到目前为止,我发现的唯一解决方案就是在旋转设备时关闭弹出窗口/

答案 2 :(得分:4)

这是我的一个项目的代码片段。基本上,如果显示弹出框,则会在方法didRotateFromInterfaceOrientation:中再次显示弹出窗口,该方法在用户界面旋转发生后发送到视图控制器。 ({1}}和willRotate...方法在旋转之前被称为,因此willAnimateRotation...方法调用的位置错误。)

presentPopover...

在上面,- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { // if the popover is showing, adjust its position after the re-orientation by presenting it again: if (self.myPopoverController != nil) // if the popover is showing (replace with your own test if you wish) { [self.myPopoverController presentPopoverFromRect:attachmentRect inView:myView permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES]; } } 是我的视图控制器的属性,我在创建时存储对弹出窗口的引用。当我在正常情况下解雇并丢弃弹出窗口时,我会注意将此属性设置为self.myPopoverController,因此我可以检查它是否为“非nil”以确定弹出框是否正在所示。

但请注意,您不需要在轮换发生之前关闭弹出窗口。再次出现相同的弹出窗口。 (这是保持对弹出窗口的引用派上用场的方法。)

在你的情况下,popover从工具栏按钮发出,你会使用类似下面的内容:

nil

答案 3 :(得分:3)

如果您只是使用presentPopoverFromBarButtonItem方法来显示弹出窗口,那么当旋转设备时,弹出窗口将自动移动到新按钮位置的正确位置。

答案 4 :(得分:2)

您是否正在调用presentPopoverFromBarButtonItem或FromRect?您是否在旋转时对BarButtonItem进行了任何更改?

Apple的文档明确规定您需要管理FromRect的轮换位置或修改条形按钮项。见http://developer.apple.com/library/ios/#documentation/uikit/reference/UIPopoverController_class/Reference/Reference.html

中的第四段

答案 5 :(得分:2)

我曾多次遇到同样的问题。我通常只是制作一个方法来显示像这样的popover:

- (void) showPopoverForSize:(CGSize) size center:(CGPoint) center {
   CGFloat width = size.width;
    CGFloat height = size.height;
    CGFloat x = center.x - width / 2;
    CGFloat y = center.y - height / 2;
    CGRect frame = CGRectMake(x, y, width, height);
    popover.popoverContentSize = frame.size;

    [popover presentPopoverFromRect:frame inView:self.view permittedArrowDirections:0 animated:YES];
}

然后在didRotate上我做了:

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    [super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
    if (popover.isPopoverVisible)
        [self showPopoverForSize:popover.popoverContentSize center:self.view.center];
}

这会将弹出窗口置于任何方向的中心。

答案 6 :(得分:1)

在方向改变开始时忽略弹出窗口,并且在方向改变完成后再次改变它并且它改变它在屏幕上的位置:

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Do
  WScript.Sleep 300
  Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process")
  For Each objProcess In colProcesses
    If Right(objProcess.Name, 4) = ".scr" Then
      wshShell.SendKeys "{SCROLLLOCK}"
    End If 
  Next
Loop

答案 7 :(得分:0)

执行弹出功能:

func presentPopover() {
    self.popoverFlag = true
    //Presenting PopOver code goes here
    // ...
}

在更改方向时解除呈现的弹出窗口:

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

        if self.isKindOfClass(ViewController) && self.popoverFlag{
            guard self.presentedViewController != nil else { return }
            dispatch_async(dispatch_get_main_queue()) {
                self.presentedViewController!.dismissViewControllerAnimated(true, completion: nil)
            }
        }
    }

再次呈现popover:

func popoverPresentationController(popoverPresentationController: UIPopoverPresentationController, willRepositionPopoverToRect rect: UnsafeMutablePointer<CGRect>, inView view: AutoreleasingUnsafeMutablePointer<UIView?>) {
    self.presentPopover()
}

答案 8 :(得分:0)

您应该使用UIPopoverPresentationControllerDelegate方法:

func popoverPresentationController(_ popoverPresentationController: UIPopoverPresentationController, willRepositionPopoverTo rect: UnsafeMutablePointer<CGRect>, in view: AutoreleasingUnsafeMutablePointer<UIView>)

并更新rect值。

请参阅@Hugo Alonso的回答here