Skip to content
This repository has been archived by the owner on May 1, 2024. It is now read-only.

[iOS,Android] Handle Appearing/Disappearing on CarouselPage #4475

Merged
merged 3 commits into from
Nov 27, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ public AppearingPage (int id)
Children = {
new Label { Text = $"Hello Appearing {_theId} page" },
new Button { Text = "Push new Page", Command = new Command ( async () => { await Navigation.PushAsync( new AppearingPage(2)); }) },
new Button { Text = "Add new Page", Command = new Command ( () => { (Parent as CarouselPage).Children.Add( new AppearingPage(3)); }) },
new Button { Text = "Pop page", Command = new Command ( async () => { await Navigation.PopAsync(); }) },
new Button { Text = "Pop to root", Command = new Command ( async () => { await Navigation.PopToRootAsync(); }) },
new Button { Text = "Change Main Page", Command = new Command ( () => {
Expand Down
18 changes: 18 additions & 0 deletions Xamarin.Forms.Platform.Android/AppCompat/CarouselPageRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ public class CarouselPageRenderer : VisualElementRenderer<CarouselPage>, ViewPag
{
bool _disposed;
FormsViewPager _viewPager;
Page _previousPage;

public CarouselPageRenderer(Context context) : base(context)
{
Expand All @@ -36,6 +37,12 @@ void ViewPager.IOnPageChangeListener.OnPageScrollStateChanged(int state)
void ViewPager.IOnPageChangeListener.OnPageSelected(int position)
{
Element.CurrentPage = Element.Children[position];
if (_previousPage != Element.CurrentPage)
{
_previousPage?.SendDisappearing();
_previousPage = Element.CurrentPage;
}
Element.CurrentPage.SendAppearing();
}

protected override void Dispose(bool disposing)
Expand All @@ -62,6 +69,8 @@ protected override void Dispose(bool disposing)
_viewPager = null;
}

_previousPage = null;

if (Element != null)
PageController.InternalChildren.CollectionChanged -= OnChildrenCollectionChanged;
}
Expand All @@ -72,12 +81,18 @@ protected override void Dispose(bool disposing)
protected override void OnAttachedToWindow()
{
base.OnAttachedToWindow();
if (Parent is PageContainer pageContainer && (pageContainer.IsInFragment || pageContainer.Visibility == ViewStates.Gone))
return;
PageController.SendAppearing();
Element.CurrentPage?.SendAppearing();
}

protected override void OnDetachedFromWindow()
{
base.OnDetachedFromWindow();
if (Parent is PageContainer pageContainer && pageContainer.IsInFragment)
return;
Element.CurrentPage?.SendDisappearing();
PageController.SendDisappearing();
}

Expand Down Expand Up @@ -107,7 +122,10 @@ protected override void OnElementChanged(ElementChangedEventArgs<CarouselPage> e
ViewGroup.AddView(pager);
CarouselPage carouselPage = e.NewElement;
if (carouselPage.CurrentPage != null)
{
_previousPage = carouselPage.CurrentPage;
ScrollToCurrentPage();
}

((IPageController)carouselPage).InternalChildren.CollectionChanged += OnChildrenCollectionChanged;
}
Expand Down
20 changes: 20 additions & 0 deletions Xamarin.Forms.Platform.Android/Renderers/CarouselPageRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ namespace Xamarin.Forms.Platform.Android
public class CarouselPageRenderer : VisualElementRenderer<CarouselPage>
{
ViewPager _viewPager;
Page _previousPage;

public CarouselPageRenderer(Context context) : base(context)
{
Expand All @@ -27,6 +28,8 @@ protected override void Dispose(bool disposing)
{
if (disposing && _viewPager != null)
{
_previousPage = null;

if (_viewPager.Adapter != null)
_viewPager.Adapter.Dispose();
_viewPager.Dispose();
Expand All @@ -44,12 +47,18 @@ protected override void OnAttachedToWindow()

adapter.UpdateCurrentItem();

if (Parent is PageContainer pageContainer && (pageContainer.IsInFragment || pageContainer.Visibility == ViewStates.Gone))
return;
PageController.SendAppearing();
Element.CurrentPage?.SendAppearing();
}

protected override void OnDetachedFromWindow()
{
base.OnDetachedFromWindow();
if (Parent is PageContainer pageContainer && pageContainer.IsInFragment)
return;
Element.CurrentPage?.SendDisappearing();
PageController.SendDisappearing();
}

Expand All @@ -66,9 +75,14 @@ protected override void OnElementChanged(ElementChangedEventArgs<CarouselPage> e

_viewPager = new ViewPager(Context);


AddView(_viewPager);

_viewPager.OffscreenPageLimit = int.MaxValue;

if (Element.CurrentPage != null)
_previousPage = Element.CurrentPage;

}

protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
Expand Down Expand Up @@ -105,6 +119,12 @@ void UpdateCurrentItem()
return;

_viewPager.CurrentItem = index;
if (_previousPage != Element.CurrentPage)
{
_previousPage?.SendDisappearing();
_previousPage = Element.CurrentPage;
}
Element.CurrentPage.SendAppearing();
}
}
}
17 changes: 15 additions & 2 deletions Xamarin.Forms.Platform.iOS/Renderers/CarouselPageRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,15 @@ public class CarouselPageRenderer : UIViewController, IVisualElementRenderer
bool _ignoreNativeScrolling;
UIScrollView _scrollView;
VisualElementTracker _tracker;
Page _previousPage;

public CarouselPageRenderer()
{
}

IElementController ElementController => Element as IElementController;


protected CarouselPage Carousel
{
get { return (CarouselPage)Element; }
Expand Down Expand Up @@ -63,6 +65,8 @@ public void SetElement(VisualElement element)

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

_previousPage = Carousel?.CurrentPage;
}

public void SetElementSize(Size size)
Expand Down Expand Up @@ -167,6 +171,8 @@ protected override void Dispose(bool disposing)
{
if (disposing && !_disposed)
{
_previousPage = null;

if (_scrollView != null)
_scrollView.DecelerationEnded -= OnDecelerationEnded;

Expand Down Expand Up @@ -259,8 +265,15 @@ void OnDecelerationEnded(object sender, EventArgs eventArgs)
{
if (_ignoreNativeScrolling || SelectedIndex >= ElementController.LogicalChildren.Count)
return;

Carousel.CurrentPage = (ContentPage)ElementController.LogicalChildren[SelectedIndex];

var currentPage = (ContentPage)ElementController.LogicalChildren[SelectedIndex];
if (_previousPage != currentPage)
{
_previousPage?.SendDisappearing();
_previousPage = currentPage;
}
Carousel.CurrentPage = currentPage;
currentPage.SendAppearing();
}

void OnPagesChanged(object sender, NotifyCollectionChangedEventArgs e)
Expand Down
10 changes: 9 additions & 1 deletion Xamarin.Forms.Platform.iOS/Renderers/PageRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,12 @@ public override void ViewDidAppear(bool animated)
return;

_appeared = true;
Page.SendAppearing();
UpdateStatusBarPrefersHidden();

if (Element.Parent is CarouselPage)
return;

Page.SendAppearing();
}

public override void ViewDidDisappear(bool animated)
Expand All @@ -106,6 +110,10 @@ public override void ViewDidDisappear(bool animated)
return;

_appeared = false;

if (Element.Parent is CarouselPage)
return;

Page.SendDisappearing();
}

Expand Down