2013-09-28 60 views
4

我有一個我一直在使用的UIPopoverController。我現在正在更新我的iOS 7代碼,當我調整彈出窗口大小時,它突然在屏幕上移動,從而導致非常糟糕的用戶體驗。當我調整它的大小時,UIPopoverController會移動

當我縱向時,它不會發生。我點擊打開popover,然後點擊導致popover擴展的按鈕,一切正常。但是,如果我切換到橫向並執行相同的操作,當我點擊按鈕展開彈出窗口時,它會滑動到另一個位置。

下面是一個視頻顯示什麼我談論:https://vimeo.com/75632364

此運行,當用戶敲擊引起酥料餅的縮放按鈕的代碼:

- (IBAction) touchedButtonPayDownLoan:(id)sender { 

    UIView *payOffView = nil; 
    if ([self.liability isBankLoan]) { 
     payOffView = self.viewPayoffBank; 
    } else { 
     payOffView = self.viewPayoffOther; 
    } 

    CGRect loanFrame = payOffView.frame; 
    loanFrame.origin.y = self.toolbar.frame.origin.y; 
    payOffView.frame = loanFrame; 
    [self.view addSubview:payOffView]; 
    [self.view bringSubviewToFront:self.toolbar]; 

    [UIView beginAnimations:@"Show Payoff View" context:nil]; 

    NSMutableArray *items = [[self.toolbar items] mutableCopy]; 
    [items removeLastObject]; 
    [items addObject:self.barButtonFinish]; 
    self.toolbar.items = items; 

    // -------- RELEVANT BITS HERE --------- 
    CGRect frame = self.view.frame; 
    frame.size.height += payOffView.frame.size.height; 
    self.view.frame = frame; 
    self.preferredContentSize = frame.size; 
    // -------- RELEVANT BITS HERE --------- 

    [UIView commitAnimations]; 

} 

我不你不想跳過跳躍的位置,因爲這會惹惱用戶。有任何想法嗎?

回答

0

乍一看,你的代碼看起來很好。我沒有使用過beginAnimations:context:,所以我檢查了UIView documentation它,它包含此評論:

使用此方法在iOS 4.0的鼓勵及更高版本。您應該使用基於塊的動畫方法 來指定您的動畫。

因此,我建議將您的代碼更改爲使用基於塊的動畫方法,例如, animateWithDuration:animations:並查看您的popover是否仍然意外移動。

1

當酥料餅是可見的,你想改變它的大小,你應該使用:

-[UIPopover setPopoverContentSize:animated:]

不應該直接更改控制器的frame

4

我遇到了類似的問題,我發現popover的移動是由佈局經理認爲新的尺寸的popover不適合在最後位置的事實引起的,或者會更好看新的 - 你是最有可能

permittedArrowDirections = UIPopoverArrowDirectionAny 

創建酥料餅有什麼困惑的是,雖然酥料餅移動到新位置的箭頭沒有得到重繪。

在我的最後,我已經通過明確地設置allowedArrowDirections爲一個值(UP或DOWN)並且調整大小不再讓我的popover四處移動來解決問題。

希望這會有所幫助。

+0

不幸的是,這不是一個完美的解決方案,因爲很多應用程序(包括礦山)需要從屏幕上的任何位置呈現酥料餅。 – Bek

+0

然後,只需編寫一些代碼來重新計算位置,並根據位置選擇箭頭方向,但是如果您想稍後調整彈出窗口大小,請不要讓iOS自行決定。 –

0

多虧了@PeterSarnowski答案我能夠從iOS7走動停止我酥料餅:(?也許現在仍然是)

[myPopoverController presentPopoverFromRect:view.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:NO]; 

我不知道這是否解決辦法是必要的,因爲蘋果是考慮改變pop7在iOS7中的行爲:

但顯然文件是不是在目前的時間準確。iOS 7 - UIPopoverController : deprecated arrows?

0

你應該看看新popoverController:willRepositionPopoverToRect:inView:方法UIPopoverControllerDelegate iOS中7.你可以調整在那裏UIPopover的位置。

Apple's documentation

對於使用presentPopoverFromRect已提交該popovers:inView:permittedArrowDirection s:animated:方法,popover控制器在界面方向更改時調用此方法。您的代表可以使用此方法來調整建議的彈出式位置。

+0

經過幾次測試後,我可以確認您提到的委託僅在界面旋轉過程中被調用,這與所描述的場景不同。 – Omer

相關問題