2016-09-09 17 views
0

iOS9の場合UIPopoverPresentationControllerで画面を回転させると、座標は0にリセットされ、sourceViewにはボタンが割り当てられません。ios 9 UIPopoverPresentationController回転の定数配置

私が試みた:

FUNCのpopoverPresentationController(popoverPresentationController:UIPopoverPresentationController、willRepositionPopoverToRect四角形:UnsafeMutablePointer、のInViewビュー:AutoreleasingUnsafeMutablePointer){ rect.initialize(CGRectMake(200、200、400、400)) }

ただし、利用できません。どんな助け?

+0

'rect.initialize(CGRectMake(200、200、400、400)'本当ですか?それがあなたのコードなら、何も起こっていないのは不思議ではありません。 – matt

答えて

1

それからちょうどポップオーバーのソースとして使用し、あなたにsourceViewボタンを制約を適用できます。

myPopoverViewController.popoverPresentationController?.sourceView = button

あなたはまた、ストーリーボードにsourceViewを設定することができますが、sourceRectをコードで設定する必要があります

myPopoverViewController.popoverPresentationController?.sourceRect = button.bounds

正しく配置するには、ポップオーバー矢印の正しいソース矩形が必要です。 これで、回転でポップオーバーを閉じる必要はありません。 UIPopoverPresentationControllerはそれを行います。 popoverの作成時にsourceView/sourceRectが設定されると、sourceViewを更新する必要はありません。

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { 
    super.viewWillTransition(to: size, with: coordinator) 
    coordinator.animate(alongsideTransition: { _ in 
     if self.popover != nil { 
      // optionally scroll to popover source rect, if inside scroll view 
      let rect = ... 
      self.scrollView.scrollRectToVisible(rect, animated: false) 

      // update source rect constraints 
      buttonConstraint.constant = ... 
      button.setNeedsLayout() 
      button.layoutIfNeeded() 
     } 
    }, completion: nil) 
} 

説明:サイズと向きの変化をキャッチする

使用viewWillTransition トリックanimate(alongsideTransition: ((UIViewControllerTransitionCoordinatorContext) -> Void)?, completion: ((UIViewControllerTransitionCoordinatorContext) -> Void)? = nil)では、あなたがいないcompletionで、alongsideTransition閉鎖であなたの制約を更新するべきであるということです。このようにして、回転の最後にポップオーバーを復元するときに、UIPopoverPresentationControllerが更新されたsourceRectを持つようにします。

逆直観的に思われるかもしれないのは、alongsideTransitionクロージャの中に、あなたの制約計算を派生させた新しいレイアウトが既にあることです。

関連する問題