如何使UIPopoverController自动更改其箭头方向

时间:2012-07-17 11:32:07

标签: ios cocoa-touch uipopovercontroller

我在UIPopOverController中遇到了奇怪的问题。 通常,我用这种方式提出popover:

[popoverVC presentPopoverFromRect:sender.frame
              inView:sender.superview
              permittedArrowDirections:UIPopoverArrowDirectionLeft
              animated:NO];

但是,有时按钮右侧没有足够的空间(发件人),并且弹出按钮显示在UIPopoverArrowDirectionUP按钮下方。这是有意义的 - 如果弹出窗口无法正确显示,控制器会尝试用不同的箭头显示它。

但是当我将按钮(发送者)向左移动大约10个像素时,弹出窗口不会以这种方式运行。仍然没有足够的空间来正确显示它但它不会改变它的箭头,虽然popover是~20px宽所以它太小了。

有没有办法说popovercontroller:“如果popover没有足够的空间来显示所有内容,请更改箭头方向”?

1 个答案:

答案 0 :(得分:4)

为什么不使用Apple推荐的UIPopoverArrowDirectionAny,或者,如果绝对必须,UIPopoverArrowDirectionLeft | UIPopoverArrowDirectionUp?弹出箭头的确切方向很少发生。

如果这不起作用,我想唯一的选择是在动作方法中做一些数学运算。 (免责声明:我从未尝试过这个,但我不明白为什么你不能这样做,如果你绝对不得不这样做。)首先将发送者的边界转换为顶级视图的坐标空间。根据应用程序视图层次结构的具体情况,您可能需要将边界/框架转换为适当的视图。除非你有一些奇怪的事情发生,否则这应该有效:

[self.view convertRect:[sender bounds] fromView:sender]

然后检查生成的矩形是否超过 X 指向远离屏幕右边缘的点,其中 X 是弹出窗口的宽度(包括黑色边框)和箭头)。如果有足够的空间,请按上述说明提供弹出窗口。如果没有,请改用UIPopoverArrowDirectionUp。