在设备旋转时重新定位 UIPopoverController

Posted

技术标签:

【中文标题】在设备旋转时重新定位 UIPopoverController【英文标题】:Repositioning UIPopoverController on device rotation 【发布时间】:2014-08-11 12:03:23 【问题描述】:

我正在尝试在设备旋转时重新定位弹出视图。我使用此代码创建弹出框:

        settingsViewCtrl = storyboard.instantiateViewControllerWithIdentifier("settingsViewCtrl") as SettingsViewCtrl;
        settingsPopoverCtrl = UIPopoverController(contentViewController: settingsViewCtrl);
        settingsPopoverCtrl.delegate = self;
        let m:CGFloat = min(view.frame.width, view.frame.height);
        let s:CGSize = CGSizeMake(m - 100, m - 100);
        let r:CGRect = CGRectMake(view.frame.width * 0.5, view.frame.height * 0.5, 1, 1);
        settingsPopoverCtrl.setPopoverContentSize(s, animated: true);
        settingsPopoverCtrl.presentPopoverFromRect(r, inView: view, permittedArrowDirections: nil, animated: true);

我在我的委托中使用willRepositionPopoverToRect ...

func popoverController(popoverController:UIPopoverController!, willRepositionPopoverToRect rect:UnsafeMutablePointer<CGRect>, inView view:AutoreleasingUnsafeMutablePointer<UIView?>)

    if (settingsPopoverCtrl != nil && settingsViewCtrl != nil)
    
        let r:CGRect = CGRectMake(self.view.frame.width * 0.5, self.view.frame.height * 0.5, 1, 1);
        settingsPopoverCtrl.presentPopoverFromRect(r, inView: self.view, permittedArrowDirections: nil, animated: true);
    

但这不可能,因为当我旋转设备时,我收到了警告: 应用程序试图代表一个活动的弹出框演示: 并且弹出框也没有重新定位。

如何在 willRepositionPopoverToRect 中应用和更新定位 CGRect 以便弹出视图更新?是否可以修改提供的rect:UnsafeMutablePointer&lt;CGRect&gt; 并将其返回给弹出框?


更新:

根据文档 (https://developer.apple.com/library/ios/documentation/uikit/reference/UIPopoverControllerDelegate_protocol/Reference/Reference.html#//apple_ref/occ/intfm/UIPopoverControllerDelegate/popoverController%3awillRepositionPopoverToRect%3ainView%3a):

如果您想为弹出框建议一个不同的矩形,请将 此参数中的新值。

所以问题是:如何将新值放入这个矩形?

【问题讨论】:

【参考方案1】:

让我回答这个问题:

        let r:CGRect = CGRectMake(self.view.frame.width * 0.5, self.view.frame.height * 0.5, 1, 1);
        rect.initialize(r);

... 显然会以新的尺寸初始化给定的矩形,并且在更改设备旋转时它可以完美地工作,这与 Apple 文档上的误导性代码不同,他们告诉再次使用 presentPopoverFromRect,这完全不起作用。

【讨论】:

以上是关于在设备旋转时重新定位 UIPopoverController的主要内容,如果未能解决你的问题,请参考以下文章

当方向改变时重新定位控件

UITableView 旋转问题

iPad和iPhone的方向:当我单击第二个视图并旋转然后切换回第一个视图时,我的控件没有重新定位

旋转设备时磁场测量的奇怪行为

使用*标准*定位服务的后台 iOS 应用程序是不是会在设备重新启动时重新启动?

为啥窗口的子视图最初定位不正确,但旋转后重新定位正确?