如何在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;
}
}
}
}
}
}