예제 #1
0
        protected override void OnLayout(bool changed, int l, int t, int r, int b)
        {
            AToolbar bar = _toolbar;

            // make sure bar stays on top of everything
            bar.BringToFront();

            int barHeight = ActionBarHeight();

            if (Element.IsSet(BarHeightProperty))
            {
                barHeight = Element.OnThisPlatform().GetBarHeight();
            }

            if (barHeight != _lastActionBarHeight && _lastActionBarHeight > 0)
            {
                ResetToolbar();
                bar = _toolbar;
            }
            _lastActionBarHeight = barHeight;

            bar.Measure(MeasureSpecFactory.MakeMeasureSpec(r - l, MeasureSpecMode.Exactly), MeasureSpecFactory.MakeMeasureSpec(barHeight, MeasureSpecMode.Exactly));

            var barOffset       = ToolbarVisible ? barHeight : 0;
            int containerHeight = b - t - ContainerTopPadding - barOffset - ContainerBottomPadding;

            PageController.ContainerArea = new Rectangle(0, 0, Context.FromPixels(r - l), Context.FromPixels(containerHeight));

            // Potential for optimization here, the exact conditions by which you don't need to do this are complex
            // and the cost of doing when it's not needed is moderate to low since the layout will short circuit pretty fast
            Element.ForceLayout();

            base.OnLayout(changed, l, t, r, b);

            bool toolbarLayoutCompleted = false;

            for (var i = 0; i < ChildCount; i++)
            {
                AView child = GetChildAt(i);

                Page childPage = (child as PageContainer)?.Child?.Element as Page;

                if (childPage == null)
                {
                    return;
                }

                // We need to base the layout of both the child and the bar on the presence of the NavBar on the child Page itself.
                // If we layout the bar based on ToolbarVisible, we get a white bar flashing at the top of the screen.
                // If we layout the child based on ToolbarVisible, we get a white bar flashing at the bottom of the screen.
                bool childHasNavBar = NavigationPage.GetHasNavigationBar(childPage);

                if (childHasNavBar)
                {
                    bar.Layout(0, 0, r - l, barHeight);
                    child.Layout(0, barHeight + ContainerTopPadding, r, b - ContainerBottomPadding);
                }
                else
                {
                    bar.Layout(0, -1000, r, barHeight - 1000);
                    child.Layout(0, ContainerTopPadding, r, b - ContainerBottomPadding);
                }
                toolbarLayoutCompleted = true;
            }

            // Making the layout of the toolbar dependant on having a child Page could potentially mean that the toolbar is not laid out.
            // We'll do one more check to make sure it isn't missed.
            if (!toolbarLayoutCompleted)
            {
                if (ToolbarVisible)
                {
                    bar.Layout(0, 0, r - l, barHeight);
                }
                else
                {
                    bar.Layout(0, -1000, r, barHeight - 1000);
                }
            }
        }