Xamarin.iOS 旋转弹出窗口

Xamarin.iOS Popovers on Rotate

我看过很多关于处理 iOS 弹出窗口旋转的帖子,但其中大多数的目标是 < iOS8 and/or Swift/ObjC。我怎样才能用 UIPopoverPresentationController 和 Xamarin.iOS 做到这一点?我需要将它保持在屏幕中央。

  public override void ViewDidLoad()
  {
     ...

     _menuController.PopoverPresentationController.PermittedArrowDirections = 0;
     _menuController.PopoverPresentationController.WillReposition += OnWillReposition;
  }

  private void OnMenuSelected(object sender, EventArgs eventArgs)
  {
     InitializePopover();

     PresentViewController(_menuController, true, null);
  }

  private void OnWillReposition(object sender, UIPopoverPresentationControllerRepositionEventArgs args)
  {
     InitializePopover();
  }

  private void InitializePopover()
  {
     _menuController.PopoverPresentationController.SourceRect = GetCenterRect();
     _menuController.PopoverPresentationController.SourceView = View;
  }

  private CGRect GetCenterRect()
  {
     var midX = View.Bounds.GetMidX();
     var midY = View.Bounds.GetMidY();
     return new CGRect(midX, midY, 0, 0);
  }

OnWillReposition 在旋转时调用,但设置 SourceRectSourceView 似乎没有生效。当我再次旋转时,我可以在调试期间看到这些属性具有旧值。

到目前为止我看到的热门链接:

其他想法:

我在发帖前弄明白了。我的问题是我没有每次都设置 PermittedArrowDirections。 Vent:谁认为这是个好主意?无论如何,在完成那部分初始化之后,我只是在ViewDidLayoutSubviews中调用它,如下所示:

  public override void ViewDidLayoutSubviews()
  {
     base.ViewDidLayoutSubviews();

     InitializePopover();
  }

  private void InitializePopover()
  {
     _menuController.PopoverPresentationController.PermittedArrowDirections = 0;
     _menuController.PopoverPresentationController.SourceRect = GetCenterRect();
     _menuController.PopoverPresentationController.SourceView = View;
  }

所以我根本不使用 UIPopoverPresentationController.WillReposition 事件。我希望这对某人有所帮助——我不希望我最大的敌人经历所有这些挫折。