2012-07-17 52 views
0

我在UIPopOverController中遇到了奇怪的問題。 通常情況下,我提出酥料餅這種方式:如何使UIPopoverController自動更改其箭頭方向

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

但是,有時有在按鈕(發送者)的右側沒有足夠的空間和酥料餅顯示具有UIPopoverArrowDirectionUP下面的按鈕。它是有道理的 - 如果popover無法正確顯示,控制器會嘗試以不同的箭頭顯示它。

但是,當我將我的按鈕(發件人)向左移動約10個像素時,彈出窗口不會以這種方式運行。仍然沒有足夠的空間來正確顯示它,但它不會改變它的箭頭,儘管彈出寬度大約20px,所以它太小了。

有什麼辦法可以說popovercontroller:「如果彈窗沒有足夠的空間來顯示所有內容,改變箭頭方向」?

回答

4

爲什麼不使用UIPopoverArrowDirectionAny,Apple建議,或者,如果您絕對必須使用UIPopoverArrowDirectionLeft | UIPopoverArrowDirectionUp?彈出箭頭的確切方向很少重要。

如果這不起作用,我想唯一的選擇是在動作方法中做一些數學運算。 (免責聲明:我從來沒有嘗試過這一點,但我不明白爲什麼你不能這樣做,如果你絕對必須這樣做。)首先將發送者的邊界轉換爲頂層視圖的座標空間。根據應用視圖層次的具體情況,您可能需要將界限/框架轉換爲適當的視圖。除非你有奇怪的事情一個事情,這應該工作:

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

然後檢查所生成的矩形是否是從屏幕的右側邊緣,其中X是超過X分之遙popover的寬度(包括黑色邊框和箭頭)。如果有足夠的空間,就像上面所說的那樣呈現彈出窗口。如果不是,請改用UIPopoverArrowDirectionUp。

+0

我試過UIPopoverArrowDirectionLeft | UIPopoverArrowDirectionUp,但是隻有在頂端有箭頭時才顯示,即使它仍然可以顯示在左側。 (我想UIPopOverController不知道什麼時候可能,什麼時候不可以)。 – msmialko 2012-07-17 18:38:50

+0

我試過按照你的建議手動計算屏幕邊緣的距離。也許這不是最好的解決方案,但它的工作原理。但是:我遇到了另一個問題。我想在用戶旋轉設備時更改popoverArrowDirection。有沒有辦法做到這一點,而不是解散和再次呈現? – msmialko 2012-07-17 18:44:40

+0

不幸的是,你需要做的只是你說的話 - 關閉彈出窗口並在'didRotateFromInterfaceOrientation:'中再次顯示它。 – 2012-07-17 19:07:02