【问题标题】:Reduce Toolbar Icon Padding(Xamarin.Forms)减少工具栏图标填充(Xamarin.Forms)
【发布时间】:2016-09-09 10:19:47
【问题描述】:

有没有办法在 Xamarin.Forms 中缩小导航栏上两个图标之间的间距?

问题见下图:

Icons with too much spacing

这个距离对于 2 个图标来说是可以的,但是当使用 3 个时,它会占据导航栏的一半 - 有什么办法可以减少这个吗?

提前致谢。

【问题讨论】:

  • 你在使用条形按钮吗?检查您正在使用的图像大小,因为它会增加条形按钮的大小。
  • 图像是 24x24,它占据了所有水平空间。我正在使用 Xamarin.Forms.ToolbarItems。
  • 请添加打印屏幕以更好地观看您的示例。

标签: xamarin xamarin.forms


【解决方案1】:

您可以通过创建 NavigationRenderer 或 PageRenderer 两种方式来实现。您必须重新创建 UIButtons 以替换每个工具栏项,并从 Xamarin.Forms 项中获取委托图像。当您将 CGREct 设置为 UIButton 时,您可以在此处调整高度和宽度属性。

这是我使用 PageRenderer 的实现。

[assembly: Xamarin.Forms.ExportRenderer(typeof(Xamarin.Forms.ContentPage), typeof(ContentPageRenderer))]
public class ContentPageRenderer : PageRenderer
{
     protected override void OnElementChanged(VisualElementChangedEventArgs e)
     {
         base.OnElementChanged(e);
     }

     public override void ViewWillAppear(bool animated)
     {
         base.ViewWillAppear(animated);

         var navigationItem = this.NavigationController.TopViewController.NavigationItem;

         foreach (var rightItem in navigationItem.RightBarButtonItems)
         {
             var button = new UIButton(new CGRect(0, 0, 50, 50));
             button.SetImage(rightItem.Image, UIControlState.Normal);

             FieldInfo fi = rightItem.GetType().GetField("clicked", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy);
             Delegate del = (Delegate)fi.GetValue(rightItem);
             button.TouchUpInside += (EventHandler)del;

             rightItem.CustomView = button;
        }
    }
}

注意:如果您在 Xamarin.Forms 页面中动态更改工具栏项,它将覆盖呈现更改。

希望这会有所帮助。

【讨论】:

  • 有没有办法在点击按钮时保留淡入/淡出效果?
  • 这行得通,只是色调颜色不像没有渲染器那样应用。
  • 这样,您将获得图标的色调:var button = new UIButton(UIButtonType.System);
  • 为了补充一点,我的图片被这个拉伸了,所以我添加了button.ImageView.ContentMode = UIViewContentMode.ScaleAspectFit;
【解决方案2】:

有一个简单的方法可以得到你想要的效果,查看我的示例代码:

public class MainViewController : UIViewController
{
    public MainViewController ()
    {
        this.View.Frame = UIScreen.MainScreen.Bounds;
        this.View.BackgroundColor = UIColor.Red;

        UIImage image1 = UIImage.FromFile ("test1.png");
        UIImage image2 = UIImage.FromFile ("test2.png");

        //The regular way to set right bar items
//      UIBarButtonItem barBtn1 = new UIBarButtonItem (image1, UIBarButtonItemStyle.Done, null);
//      UIBarButtonItem barBtn2 = new UIBarButtonItem (image2, UIBarButtonItemStyle.Done, null);
//      this.NavigationItem.SetRightBarButtonItems (new UIBarButtonItem[]{ barBtn1, barBtn2 }, true);

        //Use CustomView with two UIButton as a right bar item
        int btnLength = 35;

        UIButton btn1 = new UIButton ();
        btn1.Frame = new CGRect (0, 0, btnLength, btnLength);
        btn1.SetImage (image1, UIControlState.Normal);
        btn1.TouchUpInside += delegate {
            Console.WriteLine("btn1 clicked.");
        };

        UIButton btn2 = new UIButton ();
        btn2.Frame = new CGRect (10+btnLength, 0, btnLength, btnLength);
        btn2.SetImage (image2, UIControlState.Normal);
        btn2.TouchUpInside += delegate {
            Console.WriteLine("btn2 clicked.");
        };

        UIView toolbar = new UIView (new CGRect (0, 0, 10+2*btnLength, btnLength));
        toolbar.BackgroundColor = UIColor.White;

        toolbar.AddSubview (btn1);
        toolbar.AddSubview (btn2);

        this.NavigationItem.SetRightBarButtonItem (new UIBarButtonItem (toolbar),true);
    }
}

这是两种不同方式的屏幕截图,常规样式:

还有 CustomView 样式:

如果还有问题,就留在这里,我稍后再检查。

希望对你有帮助。

【讨论】:

  • 这个解决方案不适合我的问题 - 我正在使用'Xamarin.Forms.ToolbarItem's。有没有办法只减少间距?
  • 我不确定您是否可以使用与我在 Xamarin.Forms 中的代码相同的理论,但可以肯定的是,没有办法仅减少 Native 或 Xamarin.iOS 中的间距天气,所以我不'认为您无法找到仅适用于 Xamarin.Forms 的方法。顺便说一句,如果你只是想得到 Xamarin.Forms 的答案,你应该多注意描述的关键词,使用关键词“Xamarin.Forms”而不是“Xamarin iOS”。