UIPopoverController 可以在屏幕上移动吗?

Posted

技术标签:

【中文标题】UIPopoverController 可以在屏幕上移动吗?【英文标题】:Can a UIPopoverController be moved around the screen? 【发布时间】:2011-05-06 20:42:41 【问题描述】:

是否可以在 UIPopovercontroller 已经呈现后在屏幕上移动它? 我的应用程序中有一个可以轻微移动的小视图,我希望 UIPopoverController 可以随它移动,而不必在每次移动时都重新呈现 UIPopoverController。这可能吗?

【问题讨论】:

[popover presentPopoverFromRect:] 不是为你工作吗? 问题是他是否可以在popOver出现后移动它 我不认为它的位置可以直接改变。但是,如果你在它上面调用 presentPopoverFromRect 而不关闭它,它应该“移动”。 【参考方案1】:

ios 9 开始,“UIPopoverController 已弃用。弹出框现在实现为 UIViewController 演示文稿。使用 UIModalPresentationPopover 和 UIPopoverPresentationController 的模态演示样式。”

使用以下内容呈现一个弹出框。您也许可以更改 sourceRect 和 sourceView 的值,但这不是 API 的预期行为。

    DetailViewController *detailVC = self.detailViewController;
    detailVC.preferredContentSize = CGSizeMake(420, 92);
    detailVC.modalPresentationStyle = UIModalPresentationPopover;


    UIPopoverPresentationController *presController = detailVC.popoverPresentationController;
    if (presController) 
        presController.delegate = detailVC;
        presController.barButtonItem = self.detailButton;
        presController.sourceRect = self.view.frame;
        presController.sourceView = self.view;
        presController.permittedArrowDirections = UIPopoverArrowDirectionAny;
    

    [self presentViewController: detailVC animated:YES completion:^

    ];

相反,我建议保留对与弹出框一起呈现的视图控制器的引用,关闭弹出框并重新呈现。

DetailViewController *detailVC = self.detailViewController;
[self dismissViewControllerAnimated:NO completion:^

    UIPopoverPresentationController *presController = detailVC.popoverPresentationController;
    if (presController) 
        presController.delegate = detailVC;
        presController.barButtonItem = self.detailButton;
        presController.sourceRect = self.view.frame; //Update frame
        presController.sourceView = self.view;
        presController.permittedArrowDirections = UIPopoverArrowDirectionAny;
    

    [self presentViewController: detailVC animated:NO completion:^

    ];
];

【讨论】:

我一直对此投反对票。如果您要否决这个已接受的答案,请提供帮助并发表评论。 “创建自己的”不是我想要的答案 @Loukas 我希望你会更喜欢这个新答案。如果 UIPopoverPresentationController 没有提供所需的功能,您将不得不重新创建 UIPopoverController,因为 API 不是很灵活。 不确定是否需要“保留参考”:UIViewController 已经有一个 presentedViewController 属性。【参考方案2】:

您可以重新调用 presentPopoverFromRect。

见http://developer.apple.com/library/ios/#qa/qa1694/_index.html

【讨论】:

【参考方案3】:

不,你不能。这不是这样做的方法。

pover presentPopoverFromRect:

在 cmets 中提到过,但请注意

现在

你不能不重绘就代表。

【讨论】:

请在 iPad 上查看 Paper by Fifty。他们有一个包含文本字段的弹出框。弹出框在键盘上方动画,当键盘被关闭时,它动画回到原来的位置。是内置还是开发者产生的? 当键盘出现时,默认情况下 SDK 会将弹出框向上移动以适应键盘。关闭键盘后,弹出框将动画回其原始位置。这都是内置的行为。 是的,没错。我忘记了我的评论是什么意思,现在太久了。【参考方案4】:

您可以跟踪用户在屏幕周围的触摸,并使用presentPopoverFromRect: 重新显示弹出框。

【讨论】:

这值得一试,但我想这样做可能会有点贵。我敢肯定,当您将其关闭并重新显示时,会分配大量资源,这可能会给系统带来很大负担。 这是真的,但这就是良好的内存管理发挥作用的地方。尤其是在 iPad 上,你有一点点但更多的内存可以玩。

以上是关于UIPopoverController 可以在屏幕上移动吗?的主要内容,如果未能解决你的问题,请参考以下文章

使IPad的UIPopoverController等于屏幕大小

UIPopoverController的使用

iPad开发中UIPopoverController的使用

当键盘出现时,UIPopoverController 在 iOS 7 上奇怪地移动

ipad 检测 UIPopoverController 何时被解除

UIPopoverController 内的移动框架