我以相对简单的方式使用UITabbarViewController
。我的问题仅出现在iOS11版本的iPad设备上。它在iOS10或iPhone上不可见。
如果查看屏幕截图,可以看到标签的背景颜色未对齐。实际上,它是对齐的,它是tabbar本身没有占据整个宽度。因此,背景颜色与中央按钮重叠,因为它不使用最左侧和最右侧的空间。
我假设标签栏已损坏(而不是我的背景颜色,这是手动绘制的),因为外部标签的边缘不可点击,但项目定位设置为填充宽度屏幕:
TabBar.ItemPositioning = UITabBarItemPositioning.Fill;
如果您认为标签栏是全屏的,则项目大小是错误的,但如果您考虑"减少"版。所以我非常确定它在那里都很好,只要标签栏决定占据屏幕的整个宽度,按钮和背景颜色就会有正确的测量结果。
我尝试使用View.LayoutIfNeeded()
和SetNeedsLayout()
来强制重绘,但无济于事。
我不确定为什么它甚至表现得如此,而且因为它是操作系统的默认行为而且我没有做任何特别的事情,我就是这样。不确定什么甚至可以尝试。
以下是一些相关代码:
MainTabbarController tabController = (MainTabbarController)Window.RootViewController;
public override void ViewDidLayoutSubviews()
{
base.ViewDidLayoutSubviews();
ConfigureTabbar();
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
UIViewController[] tabs = //Create the VCs in the most basic way
SetViewControllers(tabs, false);
}
protected virtual void ConfigureTabbar()
{
TabBar.Translucent = false;
TabBar.ItemPositioning = UITabBarItemPositioning.Fill;
TabBar.ItemSpacing = 0;
//View.LayoutIfNeeded();
float tabbarItemWidth = (float)Math.Ceiling(View.Bounds.Width / TabBar.Items.Length) + 1; //+ 1 to avoid the right pixel that was not filled on the right tab. Strange behaviour...
TabBar.ItemWidth = tabbarItemWidth;
//var version = NSProcessInfo.ProcessInfo.OperatingSystemVersion;
NSOperatingSystemVersion ios11 = new NSOperatingSystemVersion(11, 0, 0);
if (NSProcessInfo.ProcessInfo.IsOperatingSystemAtLeastVersion(ios11))
{
if (UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Pad)
{
TabBar.SelectionIndicatorImage = _viewModel.Styles.Colors.ActiveTabColor.ToNative().ToImage(new CGRect(0, -View.SafeAreaInsets.Bottom, tabbarItemWidth, TabBar.Frame.Height));
}
else
{
TabBar.SelectionIndicatorImage = _viewModel.Styles.Colors.ActiveTabColor.ToNative().ToImage(new CGRect(0, -View.SafeAreaInsets.Bottom, tabbarItemWidth, TabBar.Frame.Height));
}
}
else
{
TabBar.SelectionIndicatorImage = _viewModel.Styles.Colors.ActiveTabColor.ToNative().ToImage(new CGSize(tabbarItemWidth, TabBar.Frame.Height));
}
UITextAttributes attrs = new UITextAttributes();
attrs.Font = _viewModel.Styles.Fonts.ExtraSmall.ToNative();
attrs.TextColor = _viewModel.Styles.Colors.ActionText.ToNative();
UITabBarItem.Appearance.SetTitleTextAttributes(attrs, UIControlState.Normal);
for (int i = 0; i < TabBar.Items.Length; i++)
{
UITabBarItem item = TabBar.Items[i];
item.Title = _viewModel.Titles[i];
item.TitlePositionAdjustment = new UIOffset(0, -4);
item.ImageInsets = new UIEdgeInsets(-2, 0, 2, 0);
}
//View.LayoutIfNeeded();
}