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); }
/// <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(); }
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(); } }
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; }
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); } } }