如何在iOS上删除Xamarin.Forms导航栏中重新出现的填充?

如何在iOS上删除Xamarin.Forms导航栏中重新出现的填充?,xamarin.forms,xamarin.ios,Xamarin.forms,Xamarin.ios,我正在使用中的代码片段删除图标之间的间距,它似乎也删除了导航栏右侧的填充。问题是,在屏幕方向改变后,在我将页面推入或弹出导航堆栈后,右侧的填充重新出现 为什么自定义渲染器第一次添加自定义视图时会删除此填充 有没有办法把填充物全部去掉 更新 正如下面的答案中所建议的那样,移除带有负常量的约束起初似乎是可行的,但这些约束在某个时候会被放回去 移除填充的方法是iOS7+和iOS11之间的差异 在iOS7+上: 我们可以通过添加UIBarButtonSystemItem.FixedSpace来删除它,如

我正在使用中的代码片段删除图标之间的间距,它似乎也删除了导航栏右侧的填充。问题是,在屏幕方向改变后,在我将页面推入或弹出导航堆栈后,右侧的填充重新出现

为什么自定义渲染器第一次添加自定义视图时会删除此填充

有没有办法把填充物全部去掉

更新

正如下面的答案中所建议的那样,移除带有负常量的约束起初似乎是可行的,但这些约束在某个时候会被放回去


移除填充的方法是iOS7+和iOS11之间的差异

在iOS7+上: 我们可以通过添加UIBarButtonSystemItem.FixedSpace来删除它,如:


我在模拟器上运行的iOS 11.2上的ViewDidLayoutSubviews和ViewWillLayoutSubviews中都添加了您的代码,但是当页面上升到导航堆栈的顶部时,负常量总是在布局发生之前放回,真奇怪!我在问题中添加了一个屏幕记录来显示行为。“但我还并没有机会在以前的版本上尝试你们的建议。@Landu MSFT,我在iOS 11.2上添加了一个屏幕记录,记录了结果
public override void ViewWillAppear(bool animated)
{
    base.ViewWillAppear(animated);

    var navigationItem = this.NavigationController.TopViewController.NavigationItem;

    List<UIBarButtonItem> list = new List<UIBarButtonItem>();
    foreach (var rightItem in navigationItem.RightBarButtonItems)
    {
        var button = new UIButton(new CGRect(0, 0, 32, 32));
        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;

        UIBarButtonItem item = new UIBarButtonItem(button);
        list.Add(item);
    }

    if (!UIDevice.CurrentDevice.CheckSystemVersion(11, 0))
    {
        UIBarButtonItem negativeSpacer = new UIBarButtonItem(UIBarButtonSystemItem.FixedSpace);
        negativeSpacer.Width = -16;
        list.Insert(0, negativeSpacer);
    }

    this.NavigationController.TopViewController.NavigationItem.RightBarButtonItems = list.ToArray();
}
public override void ViewDidLayoutSubviews()
{
    base.ViewDidLayoutSubviews();

    tryToRelayout();
}

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

    tryToRelayout();
}

void tryToRelayout()
{
    if (UIDevice.CurrentDevice.CheckSystemVersion(11, 0))
    {
        UINavigationItem item = NavigationController.TopViewController.NavigationItem;
        var array = item.RightBarButtonItems;
        if (array != null)
        {
            UIBarButtonItem buttonItem = array[0];
            if (buttonItem.CustomView.Superview != null)
            {
                UIView view = buttonItem.CustomView.Superview.Superview.Superview;
                var arrayConstraint = view.Constraints;
                foreach (NSLayoutConstraint constant in arrayConstraint)
                {
                    if (constant.Constant < 0)
                    {
                        constant.Constant = 0;
                    }
                }
            }
        }
    }
}