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 在 iOS 7 上奇怪地移动