如何使 UIPopoverController 自动改变其箭头方向
Posted
技术标签:
【中文标题】如何使 UIPopoverController 自动改变其箭头方向【英文标题】:How to make UIPopoverController change its arrow direction automatically 【发布时间】:2012-07-17 11:32:06 【问题描述】:我在 UIPopOverController 中遇到了奇怪的问题。 通常,我以这种方式呈现弹出框:
[popoverVC presentPopoverFromRect:sender.frame
inView:sender.superview
permittedArrowDirections:UIPopoverArrowDirectionLeft
animated:NO];
但是,有时按钮(发送方)右侧没有足够的空间,弹出框显示在带有 UIPopoverArrowDirectionUP 的按钮下方。这是有道理的 - 如果 popover 不能正确显示,控制器会尝试用不同的箭头显示它。
但是当我将按钮(发送器)向左移动大约 10 个像素时,弹出框的行为就不是这样了。仍然没有足够的空间来正确显示它,但它并没有改变它的箭头,尽管 popover 的宽度约为 20px,所以它太小了。
有没有办法说popovercontroller:“如果popover没有足够的空间显示所有内容,改变箭头方向”?
【问题讨论】:
【参考方案1】:为什么不使用苹果推荐的UIPopoverArrowDirectionAny
,或者,如果你绝对必须使用UIPopoverArrowDirectionLeft | UIPopoverArrowDirectionUp
?弹出框箭头的确切方向很少那么重要。
如果这不起作用,我想唯一的选择是在 action 方法中做一些数学运算。 (免责声明:我从来没有尝试过这个,但我不明白为什么你不能这样做,如果你绝对必须这样做。)首先将发送者的边界转换为***视图的坐标空间。根据应用程序视图层次结构的具体情况,您可能需要将边界/框架转换为适当的视图/从适当的视图转换。除非你有什么奇怪的事情发生,否则应该可以:
[self.view convertRect:[sender bounds] fromView:sender]
然后检查生成的矩形距离屏幕右边缘是否超过X个点,其中X是popover的宽度(包括黑色边框)和箭头)。如果有足够的空间,请按照上面的说明呈现弹出框。如果没有,请改用 UIPopoverArrowDirectionUp。
【讨论】:
我试过 UIPopoverArrowDirectionLeft | UIPopoverArrowDirectionUp,但它只在顶部显示箭头,即使它仍然可以在左侧显示。 (我猜 UIPopOverController 不知道什么时候可以,什么时候不可以)。 我已尝试按照您的建议手动计算距屏幕边缘的距离。也许这不是最好的解决方案,但它确实有效。但是:我遇到了另一个问题。我想在用户旋转设备时更改 popoverArrowDirection。有没有办法在不关闭并再次展示的情况下做到这一点? 很遗憾,您需要照您说的做——关闭弹出框并在didRotateFromInterfaceOrientation:
中再次显示。以上是关于如何使 UIPopoverController 自动改变其箭头方向的主要内容,如果未能解决你的问题,请参考以下文章
使用自适应 segue 时如何获取对 UIPopoverController 的引用?
UIPopoverController 的 UIView:如何去除阴影?
UIPopoverController,如何改变它的大小呢?
如何在 UIPopoverController 的所有其他视图之上显示 UIAlertController?