在Xamarin.Forms中复制下拉工具栏“更多”

时间:2018-01-06 15:15:45

标签: android ios xamarin xamarin.forms toolbaritems

我正在努力在IOS的ToolbarItem订单设置为Xamarin.Forms时,如何从ToolbarItem复制下拉Secondary,以便它看起来像Android一样。

以下是一些图片,可以更好地解释我在寻找的内容:

如何在Android上运行:

  1. 代码:
  2. ToolbarItem toolbarItem = new ToolbarItem()
    {
      Text = "ToolbarItem",
      Order = ToolbarItemOrder.Secondary
    };
    
    1. 关于它在Android上的外观的图片:
    2. 图片显示“更多”图标

      • Image showing the "More" icon

      图片显示“更多”图标已展开以显示更多工具栏项

      • Image showing the "More" icon expanded to show more toolbar items

      在iOS中将Order设置为Secondary时,工具栏上没有默认的“更多”图标。相反,会发生导航栏下方的栏,其中包含所有工具栏项目 - 我不希望为我的应用程序提供这些项目。

      这是在IOS之前如何实现的一个例子:

      我从其中一个实现此功能的应用中获取的屏幕截图    效果

      • A screenshot I took from one of my Apps that implements this effect

1 个答案:

答案 0 :(得分:2)

在原生iOS中,您可以使用UIPopoverController来实现效果。但请注意,此控件只能在iPad中使用。

由于您使用的是Xamarin.Forms,我们可以在iOS平台上创建自定义渲染器来实现此目的。

首先,创建一个页面渲染器以显示UIPopoverController。我们可以根据您的请求从UIBarButtonItem或UIView中显示它。在这里我使用UIBarButtonItem:

//I defined the navigateItem in the method ViewWillAppear
public override void ViewWillAppear(bool animated)
{
    base.ViewWillAppear(animated);

    rightItem = new UIBarButtonItem("More", UIBarButtonItemStyle.Plain, (sender, args) =>
    {
        UIPopoverController popView = new UIPopoverController(new ContentViewController());
        popView.PopoverContentSize = new CGSize(200, 300);
        popView.PresentFromBarButtonItem(rightItem, UIPopoverArrowDirection.Any, true);
    });

    NavigationController.TopViewController.NavigationItem.SetRightBarButtonItem(leftItem, true);
}

其次,在UIPopoverController中构造内容ViewController(就像android中的辅助列表一样):

public class ContentViewController : UIViewController
{
    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        UITableView tableView = new UITableView(new CGRect(0, 0, 200, 300));
        tableView.Source = new MyTableViewSource();
        View.AddSubview(tableView);
    }
}

public class MyTableViewSource : UITableViewSource
{
    public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
    {
        UITableViewCell cell = tableView.DequeueReusableCell(new NSString("Cell"));
        if (cell == null)
        {
            cell = new UITableViewCell(UITableViewCellStyle.Default, new NSString("Cell"));
        }

        cell.TextLabel.Text = "Item" + indexPath.Row;

        return cell;
    }

    public override nint RowsInSection(UITableView tableview, nint section)
    {
        return 10;
    }
}

最后,我们可以通过调用PresentFromBarButtonItem在屏幕上显示它。