2016-12-22 97 views
0

我想創建一個自定義渲染器,以便在用戶單擊按鈕時顯示上下文菜單。我有它在Android和UWP工作,但iOS更加困難。當我點擊按鈕時,所有內容都運行無誤,但不會顯示UIMenuController,儘管我無法再次單擊該按鈕,就好像包含該按鈕的視圖覆蓋了防止訪問該按鈕的屏幕。我嘗試將菜單控制器附加到按鈕ContextMenuViewiOS UIMenuController Xamarin Forms的自定義渲染器

這裏的風俗Xamarin形式查看 -

public class ContextMenuView : View 
{ 
    public EventHandler MenuRequested; 
    public void RequestMenu(object sender) 
    { 
     if(MenuRequested != null) 
     { 
      MenuRequested(sender, EventArgs.Empty); 
     } 
    } 
} 

ContextMenuView從按鈕的點擊事件實例化Main.xamlMain.xaml由包含正在單擊的按鈕的AbsoluteLayout組成。下面是按鈕的單擊事件 -

private void ContextMenuButton_Clicked(object sender, EventArgs e) 
    { 
     System.Diagnostics.Debug.WriteLine("Click"); 
     var button = sender as Button; 
     if (_popupMenu == null) 
     { 
      _popupMenu = new ContextMenuView(); 
      Rectangle menuPosition = new Rectangle { X = button.X, Y = button.Y, Width = 50, Height = 50 }; 
      _popupMenu.Layout(((Button)sender).Bounds); 
      AbsLayout.Children.Add(_popupMenu, menuPosition); 
      _popupMenu.IsVisible = true; 
     } 
     else 
     { 
      Rectangle menuPosition = new Rectangle { X = button.X, Y = button.Y + button.Height, Width = 50, Height = 50 }; 
      _popupMenu.Layout(((Button)sender).Bounds); 
     } 
     _popupMenu.RequestMenu(sender); 
    } 

而iOS的渲染 -

public class ContextMenuViewRendererIOS : ViewRenderer<ContextMenuView, UIView> 
{ 
    private UIView _nativeControl; 
    private ContextMenuView _xamarinControl; 
    private Xamarin.Forms.AbsoluteLayout _container; 
    private UIView _iosView; 
    private nfloat _height; 
    private nfloat _width; 

    protected override void OnElementChanged(ElementChangedEventArgs<ContextMenuView> e) 
    { 
     base.OnElementChanged(e); 
     if (Control == null) 
     { 
      if (e.NewElement != null) 
      { 
       _xamarinControl = e.NewElement; 
       _xamarinControl.MenuRequested += OnMenuRequested; 
      } 
      _height = UIScreen.MainScreen.Bounds.Height; 
      _width = UIScreen.MainScreen.Bounds.Width; 
      _nativeControl = new UIView(new CGRect(0, 0, _width, _height)); 
      SetNativeControl(_nativeControl); 

     } 
    } 

    private void OnMenuRequested(object sender, EventArgs e) 
    { 
     try 
     { 
      var _menu = UIMenuController.SharedMenuController; 
      BecomeFirstResponder(); 
      var iterm = new UIMenuItem("John", new ObjCRuntime.Selector("MenuItemAction:")); 
      _menu.MenuItems = new[] { iterm }; 
      _menu.SetTargetRect(new CGRect(10, 10, 100, 100), _nativeControl); 
      _menu.MenuVisible = true; 
     } 
     catch (Exception ex) 
     { 

      throw; 
     } 
    } 

    [Export("MenuItemAction:")] 
    private void MenuItemAction(UIMenuController controller) 
    { 
     System.Diagnostics.Debug.WriteLine("MenuItemAction"); 
    } 
} 

在此先感謝。

回答

0

自定義渲染器需要覆蓋CanBecomeFirstResponderCanPerform(Selector action, NSObject withSender)並從兩者都返回true。

相關問題