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

问题描述 投票:1回答:2

在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可能是罪魁祸首,但我无法弄清楚它的工作原理。

ios xamarin xamarin.ios uitabbarcontroller
2个回答
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);
            }

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 );
        }
© www.soinside.com 2019 - 2024. All rights reserved.