From 18b825d671e1ab137a022c267aad7a4a4d2cb6dc Mon Sep 17 00:00:00 2001 From: Jakub Florkowski Date: Fri, 21 Mar 2025 01:39:41 +0100 Subject: [PATCH 1/2] [iOS] Changing carousel view orientation with disabled loop - fix --- .../Items/iOS/CarouselViewController.cs | 14 ++++++++++ .../PublicAPI/net-ios/PublicAPI.Unshipped.txt | 1 + .../net-maccatalyst/PublicAPI.Unshipped.txt | 1 + .../TestCases.HostApp/Issues/Issue28523.xaml | 28 +++++++++++++++++++ .../Issues/Issue28523.xaml.cs | 11 ++++++++ .../Tests/Issues/Issue28523.cs | 28 +++++++++++++++++++ 6 files changed, 83 insertions(+) create mode 100644 src/Controls/tests/TestCases.HostApp/Issues/Issue28523.xaml create mode 100644 src/Controls/tests/TestCases.HostApp/Issues/Issue28523.xaml.cs create mode 100644 src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue28523.cs diff --git a/src/Controls/src/Core/Handlers/Items/iOS/CarouselViewController.cs b/src/Controls/src/Core/Handlers/Items/iOS/CarouselViewController.cs index efdeffbb634a..ba38514d11fc 100644 --- a/src/Controls/src/Core/Handlers/Items/iOS/CarouselViewController.cs +++ b/src/Controls/src/Core/Handlers/Items/iOS/CarouselViewController.cs @@ -32,6 +32,20 @@ public class CarouselViewController : ItemsViewController bool _isRotating; + public override void TraitCollectionDidChange(UITraitCollection previousTraitCollection) + { + if (previousTraitCollection.VerticalSizeClass == TraitCollection.VerticalSizeClass) + { + return; + } + + if (ItemsView?.Loop == false || _carouselViewLoopManager is null) + { + CollectionView.ReloadData(); + InitialPositionSet = false; + } + } + public CarouselViewController(CarouselView itemsView, ItemsViewLayout layout) : base(itemsView, layout) { CollectionView.AllowsSelection = false; diff --git a/src/Controls/src/Core/PublicAPI/net-ios/PublicAPI.Unshipped.txt b/src/Controls/src/Core/PublicAPI/net-ios/PublicAPI.Unshipped.txt index 8fd546ccbe70..055f1a71c005 100644 --- a/src/Controls/src/Core/PublicAPI/net-ios/PublicAPI.Unshipped.txt +++ b/src/Controls/src/Core/PublicAPI/net-ios/PublicAPI.Unshipped.txt @@ -68,6 +68,7 @@ Microsoft.Maui.Controls.HybridWebView.SetInvokeJavaScriptTarget(T! target) -> ~Microsoft.Maui.Controls.Xaml.IXamlTypeResolver.Resolve(string qualifiedTypeName, System.IServiceProvider serviceProvider = null, bool expandToExtension = true) -> System.Type ~Microsoft.Maui.Controls.Xaml.RequireServiceAttribute.RequireServiceAttribute(System.Type[] serviceTypes) -> void ~Microsoft.Maui.Controls.Xaml.RequireServiceAttribute.ServiceTypes.get -> System.Type[] +~override Microsoft.Maui.Controls.Handlers.Items.CarouselViewController.TraitCollectionDidChange(UIKit.UITraitCollection previousTraitCollection) -> void ~override Microsoft.Maui.Controls.Handlers.Items2.CarouselViewController2.CreateDelegator() -> UIKit.UICollectionViewDelegateFlowLayout ~override Microsoft.Maui.Controls.Handlers.Items2.CarouselViewController2.CreateItemsViewSource() -> Microsoft.Maui.Controls.Handlers.Items.IItemsViewSource ~override Microsoft.Maui.Controls.Handlers.Items2.CarouselViewController2.DetermineCellReuseId(Foundation.NSIndexPath indexPath) -> string diff --git a/src/Controls/src/Core/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt b/src/Controls/src/Core/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt index 6f7e75373a53..d4bc6e15e2d2 100644 --- a/src/Controls/src/Core/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt +++ b/src/Controls/src/Core/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt @@ -68,6 +68,7 @@ Microsoft.Maui.Controls.HybridWebView.SetInvokeJavaScriptTarget(T! target) -> ~Microsoft.Maui.Controls.Xaml.IXamlTypeResolver.Resolve(string qualifiedTypeName, System.IServiceProvider serviceProvider = null, bool expandToExtension = true) -> System.Type ~Microsoft.Maui.Controls.WebViewProcessTerminatedEventArgs.PlatformArgs.get -> Microsoft.Maui.Controls.PlatformWebViewProcessTerminatedEventArgs ~Microsoft.Maui.Controls.Xaml.RequireServiceAttribute.RequireServiceAttribute(System.Type[] serviceTypes) -> void +~override Microsoft.Maui.Controls.Handlers.Items.CarouselViewController.TraitCollectionDidChange(UIKit.UITraitCollection previousTraitCollection) -> void ~Microsoft.Maui.Controls.Xaml.RequireServiceAttribute.ServiceTypes.get -> System.Type[] ~override Microsoft.Maui.Controls.Handlers.Items2.CarouselViewController2.CreateDelegator() -> UIKit.UICollectionViewDelegateFlowLayout ~override Microsoft.Maui.Controls.Handlers.Items2.CarouselViewController2.CreateItemsViewSource() -> Microsoft.Maui.Controls.Handlers.Items.IItemsViewSource diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue28523.xaml b/src/Controls/tests/TestCases.HostApp/Issues/Issue28523.xaml new file mode 100644 index 000000000000..fbb9db0a0240 --- /dev/null +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue28523.xaml @@ -0,0 +1,28 @@ + + + + + + + + + + + + Baboon + Capuchin Monkey + Blue Monkey + Squirrel Monkey + Golden Lion Tamarin + Howler Monkey + + + + \ No newline at end of file diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue28523.xaml.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue28523.xaml.cs new file mode 100644 index 000000000000..0836b66b0283 --- /dev/null +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue28523.xaml.cs @@ -0,0 +1,11 @@ +namespace Maui.Controls.Sample.Issues +{ + [Issue(IssueTracker.Github, 28523, "Different behavior on iOS and Android when Loop = False", PlatformAffected.iOS)] + public partial class Issue28523 : ContentPage + { + public Issue28523() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue28523.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue28523.cs new file mode 100644 index 000000000000..e537ab59b453 --- /dev/null +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue28523.cs @@ -0,0 +1,28 @@ +using NUnit.Framework; +using UITest.Appium; +using UITest.Core; + +namespace Microsoft.Maui.TestCases.Tests.Issues +{ + public class Issue28523 : _IssuesUITest + { + const string ButtonId = "SpinButton"; + const string Success = "Success"; + + public Issue28523(TestDevice testDevice) : base(testDevice) + { + } + + public override string Issue => "Different behavior on iOS and Android when Loop = False"; + + [Test] + [Category(UITestCategories.CarouselView)] + public void AnimationCancel() + { + App.WaitForElement("Baboon"); + App.SetOrientationLandscape(); + App.WaitForElement("Baboon"); + VerifyScreenshot(); + } + } +} \ No newline at end of file From ba6ff36fdbc22eac13ef82e84c4b75380feab162 Mon Sep 17 00:00:00 2001 From: Jakub Florkowski Date: Sun, 23 Mar 2025 13:44:38 +0100 Subject: [PATCH 2/2] Added snapshots --- .../CarouselViewItemShouldScaleProperly.png | Bin 0 -> 15478 bytes .../Tests/Issues/Issue28523.cs | 37 ++++++++---------- .../CarouselViewItemShouldScaleProperly.png | Bin 0 -> 15528 bytes 3 files changed, 17 insertions(+), 20 deletions(-) create mode 100644 src/Controls/tests/TestCases.Android.Tests/snapshots/android/CarouselViewItemShouldScaleProperly.png create mode 100644 src/Controls/tests/TestCases.iOS.Tests/snapshots/ios/CarouselViewItemShouldScaleProperly.png diff --git a/src/Controls/tests/TestCases.Android.Tests/snapshots/android/CarouselViewItemShouldScaleProperly.png b/src/Controls/tests/TestCases.Android.Tests/snapshots/android/CarouselViewItemShouldScaleProperly.png new file mode 100644 index 0000000000000000000000000000000000000000..daf55575bde69605b5325321f9d46e4169bed078 GIT binary patch literal 15478 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 "Different behavior on iOS and Android when Loop = False"; + public override string Issue => "Different behavior on iOS and Android when Loop = False"; - [Test] - [Category(UITestCategories.CarouselView)] - public void AnimationCancel() - { - App.WaitForElement("Baboon"); - App.SetOrientationLandscape(); - App.WaitForElement("Baboon"); - VerifyScreenshot(); - } + [Test] + [Category(UITestCategories.CarouselView)] + public void CarouselViewItemShouldScaleProperly() + { + App.WaitForElement("Baboon"); + App.SetOrientationLandscape(); + App.WaitForElement("Baboon"); + VerifyScreenshot(); } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/Controls/tests/TestCases.iOS.Tests/snapshots/ios/CarouselViewItemShouldScaleProperly.png b/src/Controls/tests/TestCases.iOS.Tests/snapshots/ios/CarouselViewItemShouldScaleProperly.png new file mode 100644 index 0000000000000000000000000000000000000000..6f97047fc856bfab57204f52280608376f8f45c4 GIT binary patch literal 15528 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 Pq6R=to_kC8969q(_)yiT literal 0 HcmV?d00001