public static void DisposeModelAndChildrenRenderers(this VisualElement view)
        {
            IVisualElementRenderer renderer;

            foreach (var child in view.Descendants().OfType <VisualElement>())
            {
                renderer = XFPlatform.GetRenderer(child);
                XFPlatform.SetRenderer(child, null);

                if (renderer == null)
                {
                    continue;
                }

                renderer.NativeView.RemoveFromSuperview();
                renderer.Dispose();
            }

            renderer = XFPlatform.GetRenderer(view);
            if (renderer != null)
            {
                renderer.NativeView.RemoveFromSuperview();
                renderer.Dispose();
            }
            XFPlatform.SetRenderer(view, null);
        }
Exemple #2
0
        /// <summary>
        /// Updates the master detail containers.
        /// </summary>
        void UpdateMasterDetailContainers()
        {
            //((MasterDetailPage)Element).Master.PropertyChanged -= HandleMasterPropertyChanged;

            EmptyContainers();

            if (CurrentPlatform.GetRenderer(((MasterDetailPage)Element).Master) == null)
            {
                CurrentPlatform.SetRenderer(((MasterDetailPage)Element).Master, CurrentPlatform.CreateRenderer(((MasterDetailPage)Element).Master));
            }
            if (CurrentPlatform.GetRenderer(((MasterDetailPage)Element).Detail) == null)
            {
                CurrentPlatform.SetRenderer(((MasterDetailPage)Element).Detail, CurrentPlatform.CreateRenderer(((MasterDetailPage)Element).Detail));
            }

            var masterRenderer = CurrentPlatform.GetRenderer(((MasterDetailPage)Element).Master);
            var detailRenderer = CurrentPlatform.GetRenderer(((MasterDetailPage)Element).Detail);

            //((MasterDetailPage)Element).Master.PropertyChanged += HandleMasterPropertyChanged;

            this.MenuViewController.View.AddSubview(masterRenderer.NativeView);
            this.MenuViewController.AddChildViewController(masterRenderer.ViewController);

            this.RootViewController.View.AddSubview(detailRenderer.NativeView);
            this.RootViewController.AddChildViewController(detailRenderer.ViewController);

            SetNeedsStatusBarAppearanceUpdate();
        }
        public static IVisualElementRenderer GetOrCreateRenderer(this VisualElement bindable)
        {
            var renderer = XFPlatform.GetRenderer(bindable);

            if (renderer == null)
            {
                renderer = XFPlatform.CreateRenderer(bindable);
                XFPlatform.SetRenderer(bindable, renderer);
            }
            return(renderer);
        }
Exemple #4
0
 public override UIViewController ChildViewControllerForStatusBarHidden()
 {
     if (((MasterDetailPage)Element).Detail != null)
     {
         return((UIViewController)CurrentPlatform.GetRenderer(((MasterDetailPage)Element).Detail));
     }
     else
     {
         return(base.ChildViewControllerForStatusBarHidden());
     }
 }
        void SetupPage(Page page, int index)
        {
            IVisualElementRenderer renderer = Platform.GetRenderer(page);

            if (renderer == null)
            {
                renderer = Platform.CreateRenderer(page);
                Platform.SetRenderer(page, renderer);
            }

            page.PropertyChanged -= OnPagePropertyChanged;
            page.PropertyChanged += OnPagePropertyChanged;
        }
        void SetControllers()
        {
            var list   = new List <UIViewController>();
            var titles = new List <string>();

            for (var i = 0; i < Tabbed.Children.Count; i++)
            {
                var child = Tabbed.Children[i];
                //var width = DeviceDisplay.MainDisplayInfo.Width - 64;
                //child.WidthRequest = width;
                //var v = child as VisualElement;

                //if (v == null)
                //    continue;

                var renderer = Platform.GetRenderer(child);
                if (renderer == null)
                {
                    continue;
                }

                //var frameOld = renderer.ViewController.View.Frame;
                //frameOld.Width = (nfloat)width;
                //renderer.ViewController.View.Frame = frameOld;
                list.Add(renderer.ViewController);

                titles.Add(Tabbed.Children[i].Title);
            }
            ViewControllers = list.ToArray();
            var menuitems = Tabbed.Children.Select(x => new Shared.MenuItem()
            {
                Title           = x.Title,
                IconImageSource = x.IconImageSource
            }).ToList();

            TabBar.SetData(menuitems);
        }
 public override UIViewController ChildViewControllerForStatusBarHidden()
 {
     return((UIViewController)Platform.GetRenderer(Current));
 }
        void LayoutChildren(bool animated)
        {
            var    frame       = Element.Bounds.ToRectangleF();
            var    flyoutFrame = frame;
            nfloat opacity     = 1;

            flyoutFrame.Width = (int)(Math.Min(flyoutFrame.Width, flyoutFrame.Height) * 0.8);
            var detailRenderer = Platform.GetRenderer(FlyoutPage.Detail);

            if (detailRenderer == null)
            {
                return;
            }
            var detailView = detailRenderer.ViewController.View;

            var isRTL = (Element as IVisualElementController)?.EffectiveFlowDirection.IsRightToLeft() == true;

            if (isRTL)
            {
                flyoutFrame.X = (int)(flyoutFrame.Width * .25);
            }

            _flyoutController.View.Frame = flyoutFrame;

            var target = frame;

            if (Presented)
            {
                target.X += flyoutFrame.Width;
                if (_applyShadow)
                {
                    opacity = 0.5f;
                }
            }

            if (isRTL)
            {
                target.X = target.X * -1;
            }

            if (animated)
            {
                UIView.BeginAnimations("Flyout");
                var view = _detailController.View;
                view.Frame = target;
                detailView.Layer.Opacity = (float)opacity;
                UIView.SetAnimationCurve(UIViewAnimationCurve.EaseOut);
                UIView.SetAnimationDuration(250);
                UIView.CommitAnimations();
            }
            else
            {
                _detailController.View.Frame = target;
                detailView.Layer.Opacity     = (float)opacity;
            }

            FlyoutPage.FlyoutBounds = new Rectangle(flyoutFrame.X, 0, flyoutFrame.Width, flyoutFrame.Height);
            FlyoutPage.DetailBounds = new Rectangle(0, 0, frame.Width, frame.Height);

            if (Presented)
            {
                _clickOffView.Frame = _detailController.View.Frame;
            }
        }
        UIViewController GetViewController(Page page)
        {
            var renderer = Platform.GetRenderer(page);

            return(renderer?.ViewController);
        }
        public void SetCustomContent(View content)
        {
            if (content == Content)
            {
                return;
            }

            removeScolledEvent?.Invoke();
            removeScolledEvent = null;

            if (Content != null)
            {
                var oldRenderer    = Platform.GetRenderer(Content);
                var oldContentView = ContentView;
                var oldContent     = Content;

                Content     = null;
                ContentView = null;
                oldContent.ClearValue(Platform.RendererProperty);
                oldContentView?.RemoveFromSuperview();
                oldRenderer?.Dispose();
            }
            // If the user hasn't defined custom content then only the ContentView is set
            else if (ContentView != null)
            {
                var oldContentView = ContentView;
                ContentView = null;
                oldContentView.RemoveFromSuperview();
            }

            Content = content;
            if (Content != null)
            {
                var renderer = Platform.CreateRenderer(Content);
                ContentView = renderer.NativeView;
                Platform.SetRenderer(Content, renderer);
                ContentView.ClipsToBounds = true;

                // not sure if there's a more efficient way to do this
                // I can test the native control to see if it inherits from UIScrollView
                // But the CollectionViewRenderer doesn't inherit from UIScrollView
                if (Content is ScrollView sv)
                {
                    sv.Scrolled       += ScrollViewScrolled;
                    removeScolledEvent = () => sv.Scrolled -= ScrollViewScrolled;
                    void ScrollViewScrolled(object sender, ScrolledEventArgs e) =>
                    OnScrolled((nfloat)sv.ScrollY);
                }
                else if (Content is CollectionView cv)
                {
                    cv.Scrolled       += CollectionViewScrolled;
                    removeScolledEvent = () => cv.Scrolled -= CollectionViewScrolled;
                    void CollectionViewScrolled(object sender, ItemsViewScrolledEventArgs e) =>
                    OnScrolled((nfloat)e.VerticalOffset);
                }
                else if (Content is ListView lv)
                {
                    lv.Scrolled       += ListViewScrolled;
                    removeScolledEvent = () => lv.Scrolled -= ListViewScrolled;
                    void ListViewScrolled(object sender, ScrolledEventArgs e) =>
                    OnScrolled((nfloat)e.ScrollY);
                }
            }
        }
Exemple #11
0
        public void SetElement(VisualElement element)
        {
            //--------------------------------------------
            //	Initialize vars
            //--------------------------------------------
            if (this._tracker == null)
            {
                _tracker = new VisualElementTracker(this);
            }

            if (this._events == null)
            {
                _events = new EventTracker(this);
                _events.LoadEvents(View);
            }

            //--------------------------------------------
            //	Reset the old element
            //--------------------------------------------
            var oldElement = this.Element;

            if (oldElement != null)
            {
                oldElement.SizeChanged     -= PageOnSizeChanged;
                oldElement.PropertyChanged -= HandlePropertyChanged;
            }

            //--------------------------------------------
            //	Assign the new element
            //--------------------------------------------

            this.Element                  = element;
            this.Element.SizeChanged     += PageOnSizeChanged;
            this.Element.PropertyChanged += HandlePropertyChanged;

            this.Presented = ((MasterDetailPage)Element).IsPresented;

            //--------------------------------------------
            //	Setup the root and menu view controller
            //--------------------------------------------

            this.RootViewController  = new ChildViewController();
            this.LeftViewController  = new ChildViewController();
            this.RightViewController = new ChildViewController();

            //--------------------------------------------
            //	Fire the element changed event
            //--------------------------------------------

            OnElementChanged(new VisualElementChangedEventArgs(oldElement, element));

            //--------------------------------------------
            //	Update the view
            //--------------------------------------------

            /* Master Detail Container */
            UpdateMasterDetailContainers();

            /* Background */
            UpdateBackground();

            /* Menu Background */
            UpdateMenuBackground();

            /* Menu Width */
            UpdateMenuWidth();

            /* Menu Presentation Style */
            UpdateMenuPresentationStyle();

            /* Swipe Range */
            UpdateSwipeRange();

            //--------------------------------------------
            //	Attempt to automatically create a menu click event
            //--------------------------------------------

            var detailRenderer = CurrentPlatform.GetRenderer((element as MasterDetailPage).Detail) as UINavigationController;

            if (detailRenderer != null)
            {
                UIViewController firstPage = detailRenderer?.ViewControllers.FirstOrDefault();
                firstPage.NavigationItem.LeftBarButtonItem.Clicked += HandleMenuIcon_Clicked;
            }

            //EffectUtilities.RegisterEffectControlProvider(this, oldElement, element);

            //if (element != null)
            //	element.SendViewInitialized(NativeView);
        }