使用Xamarin在iOS 11上隐藏TabBar会留下一个白色矩形

时间:2017-11-06 20:30:01

标签: ios xamarin xamarin.ios uitabbarcontroller

在iOS 11之前,我在TabPage的自定义渲染器中使用此代码,以有条件地隐藏我的应用程序中的TabBar:

private void ToggleTabs(object sender, bool hideTabs)
{
    TabBar.Hidden = hideTabs;

    TabBar.Frame = TabBar.Hidden
        ? new CGRect(TabBar.Frame.X, TabBar.Frame.Y, TabBar.Frame.Width, 0)
        : new CGRect(TabBar.Frame.X, TabBar.Frame.Y, TabBar.Frame.Width, tabBarHeight);
}

在构建TabBar时计算tabBarHeight(根据文档,它应该总是49,但我讨厌幻数)。

我现在遇到的问题是,即使我正在折叠框架,仍然有一个白色矩形留在标签栏曾经的位置。我只注意到从XCode 9部署的运行iOS 11的设备上的这种行为。

我发现了一些我认为可能导致问题的SafeAreaInsets信息,但是除非我在iPhone X上运行,否则总会返回0,所以这似乎已经破灭了。

看起来iOS 11 SDK可能是罪魁祸首,但我无法弄清楚这些工作。

2 个答案:

答案 0 :(得分:0)

这对我有用:

            TabBar.Hidden = tabBarHidden;

            // The solution to the space left behind the invisible tab bar
            if (tabBarHidden)
            {
                View.Subviews[1].Frame = new CoreGraphics.CGRect(View.Subviews[1].Frame.X, View.Subviews[1].Frame.Y,
                                                                 View.Subviews[1].Frame.Width, 0);
                View.Subviews[0].Frame = new CoreGraphics.CGRect(View.Subviews[0].Frame.X, View.Subviews[0].Frame.Y,
                                                                 View.Subviews[0].Frame.Width, View.Subviews[0].Frame.Height + 49);
            }
            else
            {
                View.Subviews[1].Frame = new CoreGraphics.CGRect(View.Subviews[1].Frame.X, View.Subviews[1].Frame.Y,
                                                                 View.Subviews[1].Frame.Width, 49);
                View.Subviews[0].Frame = new CoreGraphics.CGRect(View.Subviews[0].Frame.X, View.Subviews[0].Frame.Y,
                                                                 View.Subviews[0].Frame.Width, View.Subviews[0].Frame.Height - 49);
            }

答案 1 :(得分:0)

当手机旋转时,不得不加一点调整,视图再次爆发,因此旋转发生时也会调用此代码。视图高度的小摆动似乎把它排除在外......非常黑客但3-4个小时后,我接受了黑客并继续前进!

       if (RootTabPage._fullScreen)
        {
            View.Subviews[1].Frame = new CoreGraphics.CGRect(View.Subviews[1].Frame.X, View.Subviews[1].Frame.Y,
                                                             View.Subviews[1].Frame.Width, 0);
            if( View.Frame.Height == View.Subviews[0].Frame.Height )
                View.Subviews[0].Frame = new CoreGraphics.CGRect(View.Subviews[0].Frame.X, View.Subviews[0].Frame.Y,
                                                                 View.Subviews[0].Frame.Width, View.Frame.Height + 2 );
            else
                View.Subviews[0].Frame = new CoreGraphics.CGRect(View.Subviews[0].Frame.X, View.Subviews[0].Frame.Y,
                                                                 View.Subviews[0].Frame.Width, View.Frame.Height + 3 );
        }
        else
        {
            View.Subviews[1].Frame = new CoreGraphics.CGRect(View.Subviews[1].Frame.X, View.Subviews[1].Frame.Y,
                                                             View.Subviews[1].Frame.Width, th);
            View.Subviews[0].Frame = new CoreGraphics.CGRect(View.Subviews[0].Frame.X, View.Subviews[0].Frame.Y,
                                                             View.Subviews[0].Frame.Width, View.Frame.Height );
        }