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);
        }
        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;
        }
        protected virtual void LoadRenderers()
        {
            var currentItem = ShellSection.CurrentItem;

            for (int i = 0; i < ShellSectionController.GetItems().Count; i++)
            {
                ShellContent item     = ShellSectionController.GetItems()[i];
                var          page     = ((IShellContentController)item).GetOrCreateContent();
                var          renderer = Platform.CreateRenderer(page);
                Platform.SetRenderer(page, renderer);
                AddChildViewController(renderer.ViewController);

                if (item == currentItem)
                {
                    _containerArea.AddSubview(renderer.NativeView);
                    _currentIndex = i;
                }

                _renderers[item] = renderer;
            }
        }
        void UpdateFlyoutPageContainers()
        {
            ((FlyoutPage)Element).Flyout.PropertyChanged -= HandleFlyoutPropertyChanged;

            EmptyContainers();

            if (Platform.GetRenderer(((FlyoutPage)Element).Flyout) == null)
            {
                Platform.SetRenderer(((FlyoutPage)Element).Flyout, Platform.CreateRenderer(((FlyoutPage)Element).Flyout));
            }
            if (Platform.GetRenderer(((FlyoutPage)Element).Detail) == null)
            {
                Platform.SetRenderer(((FlyoutPage)Element).Detail, Platform.CreateRenderer(((FlyoutPage)Element).Detail));
            }

            var flyoutRenderer = Platform.GetRenderer(((FlyoutPage)Element).Flyout);
            var detailRenderer = Platform.GetRenderer(((FlyoutPage)Element).Detail);

            ((FlyoutPage)Element).Flyout.PropertyChanged += HandleFlyoutPropertyChanged;

            UIView flyoutView = flyoutRenderer.NativeView;

            _flyoutController.View.AddSubview(flyoutView);
            _flyoutController.AddChildViewController(flyoutRenderer.ViewController);

            UIView detailView = detailRenderer.NativeView;

            _detailController.View.AddSubview(detailView);
            _detailController.AddChildViewController(detailRenderer.ViewController);

            SetNeedsStatusBarAppearanceUpdate();
            if (Forms.RespondsToSetNeedsUpdateOfHomeIndicatorAutoHidden)
            {
                SetNeedsUpdateOfHomeIndicatorAutoHidden();
            }

            detailRenderer.ViewController.View.Superview.BackgroundColor = Xamarin.Forms.Color.Black.ToUIColor();

            ToggleAccessibilityElementsHidden();
        }
            void UpdateCell(ViewCell cell)
            {
                if (_viewCell != null)
                {
                    Device.BeginInvokeOnMainThread(_viewCell.SendDisappearing);
                }

                _viewCell = cell;
                Device.BeginInvokeOnMainThread(_viewCell.SendAppearing);

                IVisualElementRenderer renderer;

                if (_rendererRef == null || !_rendererRef.TryGetTarget(out renderer))
                {
                    renderer = GetNewRenderer();
                }
                else
                {
                    if (renderer.Element != null && renderer == Platform.GetRenderer(renderer.Element))
                    {
                        renderer.Element.ClearValue(Platform.RendererProperty);
                    }

                    var type = Registrar.Registered.GetHandlerType(_viewCell.View.GetType());
                    if (renderer.GetType() == type || (renderer is Platform.DefaultRenderer && type == null))
                    {
                        renderer.SetElement(_viewCell.View);
                    }
                    else
                    {
                        //when cells are getting reused the element could be already set to another cell
                        //so we should dispose based on the renderer and not the renderer.Element
                        var platform = renderer.Element.Platform as Platform;
                        platform.DisposeRendererAndChildren(renderer);
                        renderer = GetNewRenderer();
                    }
                }

                Platform.SetRenderer(_viewCell.View, renderer);
            }
        protected virtual void OnChildAdded(VisualElement view)
        {
            if (_isDisposed)
            {
                return;
            }

            var viewRenderer = Platform.CreateRenderer(view);

            Platform.SetRenderer(view, viewRenderer);

            var uiview = Renderer.NativeView;

            uiview.AddSubview(viewRenderer.NativeView);

            if (Renderer.ViewController != null && viewRenderer.ViewController != null)
            {
                Renderer.ViewController.AddChildViewController(viewRenderer.ViewController);
            }

            EnsureChildrenOrder();
        }
Exemple #9
0
        protected override void Dispose(bool disposing)
        {
            if (disposing && !_disposed)
            {
                Element.PropertyChanged -= OnHandlePropertyChanged;
                Platform.SetRenderer(Element, null);
                if (_appeared)
                {
                    Page.SendDisappearing();
                }

                _appeared = false;

                if (_events != null)
                {
                    _events.Dispose();
                    _events = null;
                }

                if (_packager != null)
                {
                    _packager.Dispose();
                    _packager = null;
                }

                if (_tracker != null)
                {
                    _tracker.Dispose();
                    _tracker = null;
                }

                Element = null;
                Container?.Dispose();
                _pageContainer = null;
                _disposed      = true;
            }

            base.Dispose(disposing);
        }
		void UpdateMasterDetailContainers()
		{
			((MasterDetailPage)Element).Master.PropertyChanged -= HandleMasterPropertyChanged;

			EmptyContainers();

			if (Platform.GetRenderer(((MasterDetailPage)Element).Master) == null)
				Platform.SetRenderer(((MasterDetailPage)Element).Master, Platform.CreateRenderer(((MasterDetailPage)Element).Master));
			if (Platform.GetRenderer(((MasterDetailPage)Element).Detail) == null)
				Platform.SetRenderer(((MasterDetailPage)Element).Detail, Platform.CreateRenderer(((MasterDetailPage)Element).Detail));

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

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

			_masterController.View.AddSubview(masterRenderer.NativeView);
			_masterController.AddChildViewController(masterRenderer.ViewController);

			_detailController.View.AddSubview(detailRenderer.NativeView);
			_detailController.AddChildViewController(detailRenderer.ViewController);
		}
        void UpdateFlyoutFooter(View view)
        {
            if (_footer == view)
            {
                return;
            }

            if (_footer != null)
            {
                var oldRenderer   = Platform.GetRenderer(_footer);
                var oldFooterView = _footerView;
                _tableViewController.FooterView = null;
                _footerView = null;
                oldFooterView?.RemoveFromSuperview();
                if (_footer != null)
                {
                    _footer.MeasureInvalidated -= OnFooterMeasureInvalidated;
                }

                _footer.ClearValue(Platform.RendererProperty);
                oldRenderer?.Dispose();
            }

            _footer = view;

            if (_footer != null)
            {
                var renderer = Platform.CreateRenderer(_footer);
                _footerView = renderer.NativeView;
                Platform.SetRenderer(_footer, renderer);

                View.AddSubview(_footerView);
                _footerView.ClipsToBounds       = true;
                _tableViewController.FooterView = _footerView;
                _footer.MeasureInvalidated     += OnFooterMeasureInvalidated;
            }

            _tableViewController.FooterView = _footerView;
        }
        void UpdateMasterDetailContainers()
        {
            ((MasterDetailPage)Element).Master.PropertyChanged -= HandleMasterPropertyChanged;

            EmptyContainers();

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

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

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

            UIView masterView = masterRenderer.NativeView;

            _masterController.View.AddSubview(masterView);
            _masterController.AddChildViewController(masterRenderer.ViewController);

            UIView detailView = detailRenderer.NativeView;

            _detailController.View.AddSubview(detailView);
            _detailController.AddChildViewController(detailRenderer.ViewController);

            SetNeedsStatusBarAppearanceUpdate();
            if (Forms.RespondsToSetNeedsUpdateOfHomeIndicatorAutoHidden)
            {
                SetNeedsUpdateOfHomeIndicatorAutoHidden();
            }

            detailRenderer.ViewController.View.Superview.BackgroundColor = Xamarin.Forms.Color.Black.ToUIColor();
        }
        void InsertPage(ContentPage page, int index)
        {
            IVisualElementRenderer renderer = Platform.GetRenderer(page);

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

            UIView container = new PageContainer(page);

            container.AddSubview(renderer.NativeView);
            _containerMap[page] = container;

            AddChildViewController(renderer.ViewController);
            _scrollView.InsertSubview(container, index);

            if ((index == 0 && SelectedIndex == 0) || (index < SelectedIndex))
            {
                ScrollToPage(SelectedIndex + 1, false);
            }
        }
        void UpdateMasterDetailContainers()
        {
            ((MasterDetailPage)Element).Master.PropertyChanged -= HandleMasterPropertyChanged;

            EmptyContainers();

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

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

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

            UIView masterView = masterRenderer.NativeView;

            _masterController.View.AddSubview(masterView);
            _masterController.AddChildViewController(masterRenderer.ViewController);

            UIView detailView = detailRenderer.NativeView;

            _detailController.View.AddSubview(detailView);
            _detailController.AddChildViewController(detailRenderer.ViewController);

            SetNeedsStatusBarAppearanceUpdate();
            if (Forms.IsiOS11OrNewer)
            {
                SetNeedsUpdateOfHomeIndicatorAutoHidden();
            }
        }
Exemple #15
0
        internal void Disconnect(Shell shell = null, bool keepRenderer = false)
        {
            ViewMeasureInvalidated   = null;
            View.MeasureInvalidated -= MeasureInvalidated;
            if (_bindingContext != null && _bindingContext is BaseShellItem baseShell)
            {
                baseShell.PropertyChanged -= OnElementPropertyChanged;
            }

            _bindingContext = null;

            if (!keepRenderer)
            {
                Platform.SetRenderer(View, null);
            }

            if (shell != null)
            {
                shell.RemoveLogicalChild(shell);
            }

            View      = null;
            TableView = null;
        }
Exemple #16
0
        internal UIContainerCell(string cellId, View view, Shell shell, object context) : base(UITableViewCellStyle.Default, cellId)
        {
            View = view;
            View.MeasureInvalidated += MeasureInvalidated;
            SelectionStyle           = UITableViewCellSelectionStyle.None;

            _renderer = Platform.GetRenderer(view);

            if (_renderer == null)
            {
                _renderer = Platform.CreateRenderer(view);
                Platform.SetRenderer(view, _renderer);
            }

            ContentView.AddSubview(_renderer.NativeView);
            _renderer.NativeView.ClipsToBounds = true;
            ContentView.ClipsToBounds          = true;

            BindingContext = context;
            if (shell != null)
            {
                shell.AddLogicalChild(View);
            }
        }
        void TeardownPage(Page page, int index)
        {
            page.PropertyChanged -= OnPagePropertyChanged;

            Platform.SetRenderer(page, null);
        }
        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);
                }
            }
        }