Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使UIPopoverController自动更改其箭头方向_Ios_Cocoa Touch_Uipopovercontroller - Fatal编程技术网

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

Ios 如何使UIPopoverController自动更改其箭头方向,ios,cocoa-touch,uipopovercontroller,Ios,Cocoa Touch,Uipopovercontroller,我在UIPopOverController中遇到了一个奇怪的问题。 通常,我以这种方式呈现popover: [popoverVC presentPopoverFromRect:sender.frame inView:sender.superview permittedArrowDirections:UIPopoverArrowDirectionLeft animated:NO]; 但是,有时按钮(发送器)右侧没

我在UIPopOverController中遇到了一个奇怪的问题。 通常,我以这种方式呈现popover:

[popoverVC presentPopoverFromRect:sender.frame
              inView:sender.superview
              permittedArrowDirections:UIPopoverArrowDirectionLeft
              animated:NO];
但是,有时按钮(发送器)右侧没有足够的空间,popover会显示在按钮下方,并带有UIPopoOverArrowDirectionUp。这是有意义的-如果popover不能正确显示,控制器会尝试用不同的箭头来显示它

但是当我把我的按钮(发送器)向左移动大约10个像素时,popover就不是这样了。仍然没有足够的空间来正确显示它,但它并没有改变它的箭头,尽管popover的宽度约为20px,所以它太小了


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

为什么不使用苹果公司推荐的
uiPopOverErrorDirectionAny
,或者,如果您绝对必须使用
uiPopOverErrorDirectionLeft | uiPopOverErrorDirectionUp
?popover箭头的准确方向很少有那么重要

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

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

然后检查生成的矩形距离屏幕右边缘是否超过X点,其中X是弹出框的宽度(包括黑色边框和箭头)。如果有足够的空间,请按照上面所说的出示府绸。如果没有,请改用UIPopOverErrorDirectionUp。

为什么不使用苹果公司推荐的
UIPopOverErrorDirectionAny
,或者,如果您绝对必须使用
UIPopOverErrorDirectionLeft | UIPopOverErrorDirectionUp
?popover箭头的准确方向很少有那么重要

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

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

然后检查生成的矩形距离屏幕右边缘是否超过X点,其中X是弹出框的宽度(包括黑色边框和箭头)。如果有足够的空间,请按照上面所说的出示府绸。如果没有,请改用UIPopoverArrowDirectionUp。

我尝试过UIPopoverArrowDirectionLeft | UIPopoverArrowDirectionUp,但它只在顶部显示箭头,即使仍然可以在左侧显示。(我猜UIPopOverController不知道什么时候可能,什么时候不可能)。我已经尝试按照您的建议手动计算到屏幕边缘的距离。也许这不是最好的解决方案,但它确实有效。但是:我遇到了另一个问题。我想在用户旋转设备时更改popoverArrowDirection。有没有一种方法可以做到这一点而不必放弃并再次展示它?不幸的是,你需要按照你所说的去做——放弃popover并在
didRotateFromInterfaceOrientation:
中再次展示它。我试过UIPopopOverErrorDirectionLeft | UIPopOverErrorDirectionUp,但是,即使仍然可以在左侧显示,也只能在顶部显示箭头。(我猜UIPopOverController不知道什么时候可能,什么时候不可能)。我已经尝试按照您的建议手动计算到屏幕边缘的距离。也许这不是最好的解决方案,但它确实有效。但是:我遇到了另一个问题。我想在用户旋转设备时更改popoverArrowDirection。有没有一种方法可以做到这一点而不必放弃并再次展示它?不幸的是,您需要按照您所说的去做——放弃popover并在
didRotateFromInterfaceOrientation:
中再次展示它。