[iOS] Fix for DatePicker FlowDirection Not Working on iOS#30193
[iOS] Fix for DatePicker FlowDirection Not Working on iOS#30193kubaflo merged 9 commits intodotnet:inflight/currentfrom
Conversation
There was a problem hiding this comment.
Pull Request Overview
This PR fixes an issue where the DatePicker control's FlowDirection was not being applied properly on iOS by correcting the API signature and adding logic for text alignment adjustments.
- Updated the MapFlowDirection method signature to use IDatePickerHandler instead of DatePickerHandler.
- Added text alignment logic in DatePickerExtensions.cs based on the effective flow direction.
- Included new test cases in TestCases.HostApp and TestCases.Shared.Tests to validate the fix.
Reviewed Changes
Copilot reviewed 10 out of 12 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| src/Core/src/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt | Updated the API signature to match the expected interface type for MapFlowDirection. |
| src/Core/src/PublicAPI/net-maccatalyst/PublicAPI.Shipped.txt | Removed the old signature to reflect the breaking change. |
| src/Core/src/PublicAPI/net-ios/PublicAPI.Unshipped.txt | Updated the API signature to match the expected interface type for MapFlowDirection. |
| src/Core/src/PublicAPI/net-ios/PublicAPI.Shipped.txt | Removed the old signature to reflect the breaking change. |
| src/Core/src/Platform/iOS/DatePickerExtensions.cs | Added logic to adjust text alignment based on EffectiveFlowDirection. |
| src/Core/src/Handlers/DatePicker/DatePickerHandler.iOS.cs | Updated the MapFlowDirection method signature to use IDatePickerHandler. |
| src/Core/src/Handlers/DatePicker/DatePickerHandler.cs | Updated the MapFlowDirection method signature in the handler class. |
| src/Core/src/Handlers/DatePicker/DatePickerHandler.MacCatalyst.cs | Updated the MapFlowDirection method signature to use IDatePickerHandler. |
| src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue30065.cs | Added a test case to validate DatePicker FlowDirection behavior. |
| src/Controls/tests/TestCases.HostApp/Issues/Issue30065.cs | Added a test page to validate switching FlowDirection on DatePicker. |
Comments suppressed due to low confidence (1)
| @@ -1 +1,3 @@ | |||
| #nullable enable | |||
| *REMOVED*static Microsoft.Maui.Handlers.DatePickerHandler.MapFlowDirection(Microsoft.Maui.Handlers.DatePickerHandler! handler, Microsoft.Maui.IDatePicker! datePicker) -> void | |||
There was a problem hiding this comment.
The removal and update of the MapFlowDirection signature here introduces a breaking change in the public API. Please ensure that all consumers are aware of this change and update their implementations accordingly.
| } | ||
|
|
||
| public static partial void MapFlowDirection(DatePickerHandler handler, IDatePicker datePicker) | ||
| public static partial void MapFlowDirection(IDatePickerHandler handler, IDatePicker datePicker) |
There was a problem hiding this comment.
The method signature change for MapFlowDirection in the iOS handler is a breaking API change. Ensure that all related documentation and client codes reflect the new interface usage.
| /// <param name="handler">The associated handler.</param> | ||
| /// <param name="datePicker">The associated <see cref="IDatePicker"/> instance.</param> | ||
| public static partial void MapFlowDirection(DatePickerHandler handler, IDatePicker datePicker); | ||
| public static partial void MapFlowDirection(IDatePickerHandler handler, IDatePicker datePicker); |
There was a problem hiding this comment.
The updated MapFlowDirection signature in the handler class changes the public API contract. This is a breaking change; please ensure API consumers are notified.
| } | ||
|
|
||
| public static partial void MapFlowDirection(DatePickerHandler handler, IDatePicker datePicker) | ||
| public static partial void MapFlowDirection(IDatePickerHandler handler, IDatePicker datePicker) |
There was a problem hiding this comment.
The MapFlowDirection signature update on MacCatalyst is a breaking API change. Ensure that documentation and clients targeting MacCatalyst are updated accordingly.
| { | ||
| App.WaitForElement("ToggleFlowDirectionBtn"); | ||
| App.Tap("ToggleFlowDirectionBtn"); | ||
| VerifyScreenshot(); |
There was a problem hiding this comment.
Pending snapshot on Windows.
There was a problem hiding this comment.
@jsuarezruiz , I've updated the test case and added snapshots for iOS and Android. I will add the missing snap in the next CI run.
|
/azp run MAUI-UITests-public |
|
Azure Pipelines successfully started running 1 pipeline(s). |
|
@SyedAbdulAzeemSF4852 Could you rebase and fix the conflicts? Thanks in advance. |
1b8264f to
20a54a3
Compare
@jsuarezruiz , Rebased the branch as suggested. |
|
/azp run MAUI-UITests-public |
|
Azure Pipelines successfully started running 1 pipeline(s). |
d2ada28 to
08b5cdc
Compare
🤖 AI Summary📊 Expand Full Review —
|
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #30193 | Change signature to IDatePickerHandler + implement UpdateTextAlignment using EffectiveUserInterfaceLayoutDirection | ✅ PASSED (Gate) | 8 files | Original PR |
🔧 Fix — Analysis & Comparison
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #30193 | Change signature to IDatePickerHandler + UpdateTextAlignment via EffectiveUserInterfaceLayoutDirection | ✅ PASS (Gate) | 8 files | Original PR; includes PublicAPI tracking |
| 1 | claude-opus-4.6 | Lambda-in-Mapper bypass + SemanticContentAttribute-based alignment | ✅ PASS | 2 files | Avoids API signature change; minimal footprint |
| 2 | claude-sonnet-4.6 | Signature fix (IDatePickerHandler) + UpdateTextAlignment via datePicker.FlowDirection (MAUI model) | ✅ PASS | 6 files | Reads from MAUI model; MatchParent defaults to LTR |
| 3 | gpt-5.3-codex | Mapper bridge method (IDatePickerHandler bridge casts to DatePickerHandler) + EffectiveFlowDirection | ✅ PASS | 3 files | Keeps old signature; adds bridge overload |
| 4 | gpt-5.4 (gemini unavailable) | Reactive via PropertyChanged + MovedToWindow subscription | ✅ PASS | 2 files | Event-driven approach; more complex lifecycle |
Cross-Pollination
| Model | Round | New Ideas? | Details |
|---|---|---|---|
| claude-opus-4.6 | 2 | No | All fix strategies (signature fix, lambda, bridge, reactive, alignment source variants) exhaustively covered |
Exhausted: Yes
Selected Fix: PR's fix — Correct approach: fixes the real root cause (wrong type in partial signature), implements UpdateTextAlignment using the native UIKit layout direction (most reliable for MatchParent cases), and properly tracks the public API change. The 2-file alternatives work but leave the partial method signatures inconsistent with every other handler method. The reactive approach (Attempt 4) is unnecessarily complex for a simple signature fix. The PR's approach matches the established MAUI handler pattern.
📋 Report — Final Recommendation
✅ Final Recommendation: APPROVE
Phase Status
| Phase | Status | Notes |
|---|---|---|
| Pre-Flight | ✅ COMPLETE | Issue #30065, iOS DatePicker FlowDirection, 8 impl + 2 test files |
| Gate | ✅ PASSED | ios — ValidateDatePickerFlowDirection passes with fix, fails without |
| Try-Fix | ✅ COMPLETE | 4 attempts, all passing; PR's fix selected as best |
| Report | ✅ COMPLETE |
Summary
PR #30193 correctly fixes a long-standing iOS bug where DatePicker.FlowDirection had no effect. The fix addresses the root cause directly and follows established MAUI handler patterns. Gate passed, and 4 independent alternative fix approaches all confirmed the fix direction is sound. Selected Fix: PR.
Root Cause
The MapFlowDirection partial method was declared with a concrete DatePickerHandler parameter type in both DatePickerHandler.cs (the shared partial declaration) and the iOS/MacCatalyst implementations. The PropertyMapper registers handlers as Action<IDatePickerHandler, IDatePicker>, so C#'s method group resolution couldn't match MapFlowDirection(DatePickerHandler, IDatePicker) to the expected delegate type. This caused the mapper to silently skip the iOS-specific implementation and fall back to ViewHandler.MapFlowDirection, which only updates SemanticContentAttribute for layout direction but does not update text alignment on the native MauiDatePicker text field.
Additionally, UpdateTextAlignment was a TODO stub that did nothing.
Fix Quality
Strengths:
- Fixes the actual root cause (wrong parameter type in partial signature) rather than working around it
- The
UpdateTextAlignmentimplementation readsEffectiveUserInterfaceLayoutDirectionfrom the native view afterUpdateFlowDirectionhas already setSemanticContentAttribute— this correctly handles all threeFlowDirectionvalues includingMatchParent(which inherits from UIKit parent context) - PublicAPI tracking is properly done: old signature removed from Shipped.txt,
*REMOVED*entry and new signature added to Unshipped.txt for both iOS and MacCatalyst - UI test with screenshot verification follows the standard pattern;
#if TEST_FAILS_ON_CATALYSTguard is appropriate (linked to issue [Mac] FlowDirection Property of DatePicker Is Not Functioning as Expected #30163) - Snapshot files present for iOS, Android, and Windows
Minor observations (non-blocking):
DatePickerHandler.MacCatalyst.cshas the signature fixed but the body remains empty — this is pre-existing behavior (MacCatalyst DatePicker usesUIDatePickerdirectly with different layout semantics), and the issue title is specific to iOSTimePickerHandler.iOS.cshas an identical root-cause bug (TimePickerHandlerinstead ofITimePickerHandler) andUpdateTextAlignmentis still a TODO there — this is out of scope but worth a follow-up issue- Try-Fix confirmed that reading
datePicker.FlowDirection(MAUI model) orSemanticContentAttributewould also work, butEffectiveUserInterfaceLayoutDirectionis the most semantically correct because it reflects UIKit's resolved direction afterUpdateFlowDirectionruns, properly handlingMatchParentcases
kubaflo
left a comment
There was a problem hiding this comment.
Could you please review the AI's summary?
…DatePickerHandler
50dab77 to
6dd2d9c
Compare
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 30193Or
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 30193" |
@kubaflo , Addressed concerns raised in the AI summary. |
|
/azp run maui-pr-uitests , maui-pr-devicetests |
|
Azure Pipelines successfully started running 2 pipeline(s). |
🚦 Gate - Test Before and After Fix📊 Expand Full Gate —
|
| Test | Without Fix (expect FAIL) | With Fix (expect PASS) |
|---|---|---|
🖥️ Issue30065 Issue30065 |
✅ FAIL — 203s | ✅ PASS — 88s |
🔴 Without fix — 🖥️ Issue30065: FAIL ✅ · 203s
Determining projects to restore...
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj (in 462 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 854 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Essentials/src/Essentials.csproj (in 6.14 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/Foldable/src/Controls.Foldable.csproj (in 6.27 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj (in 6.27 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 6.27 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/BlazorWebView/src/Maui/Microsoft.AspNetCore.Components.WebView.Maui.csproj (in 6.28 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/Maps/src/Controls.Maps.csproj (in 6.28 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Core/src/Core.csproj (in 6.28 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Core/maps/src/Maps.csproj (in 6.28 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Xaml/Controls.Xaml.csproj (in 6.29 sec).
/Users/cloudtest/vss/_work/1/s/.dotnet/packs/Microsoft.iOS.Sdk.net10.0_26.0/26.0.11017/targets/Xamarin.Shared.Sdk.targets(309,3): warning : RuntimeIdentifier was set on the command line, and will override the value for RuntimeIdentifiers set in the project file. [/Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-ios]
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0-ios26.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0-ios26.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0-ios26.0/Microsoft.Maui.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Maps/Debug/net10.0-ios26.0/Microsoft.Maui.Maps.dll
Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
Microsoft.AspNetCore.Components.WebView.Maui -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Microsoft.AspNetCore.Components.WebView.Maui/Debug/net10.0-ios26.0/Microsoft.AspNetCore.Components.WebView.Maui.dll
Controls.Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.Maps.dll
Controls.Xaml -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.Xaml.dll
Controls.Foldable -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Foldable/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.Foldable.dll
Detected signing identity:
Code Signing Key: "" (-)
Provisioning Profile: "" () - no entitlements
Bundle Id: com.microsoft.maui.uitests
App Id: com.microsoft.maui.uitests
Controls.TestCases.HostApp -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-ios/iossimulator-arm64/Controls.TestCases.HostApp.dll
Optimizing assemblies for size may change the behavior of the app. Be sure to test after publishing. See: https://aka.ms/dotnet-illink
Optimizing assemblies for size. This process might take a while.
Build succeeded.
/Users/cloudtest/vss/_work/1/s/.dotnet/packs/Microsoft.iOS.Sdk.net10.0_26.0/26.0.11017/targets/Xamarin.Shared.Sdk.targets(309,3): warning : RuntimeIdentifier was set on the command line, and will override the value for RuntimeIdentifiers set in the project file. [/Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-ios]
1 Warning(s)
0 Error(s)
Time Elapsed 00:01:36.74
Determining projects to restore...
Restored /Users/cloudtest/vss/_work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 3.74 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/UITest.Core/UITest.Core.csproj (in 3.76 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj (in 3.74 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Essentials/src/Essentials.csproj (in 3.75 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/VisualTestUtils/VisualTestUtils.csproj (in 3.82 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/tests/CustomAttributes/Controls.CustomAttributes.csproj (in 3.82 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 3.85 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Core/src/Core.csproj (in 3.87 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/UITest.NUnit/UITest.NUnit.csproj (in 956 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/UITest.Appium/UITest.Appium.csproj (in 4.82 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/UITest.Analyzers/UITest.Analyzers.csproj (in 5.68 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/VisualTestUtils.MagickNet/VisualTestUtils.MagickNet.csproj (in 2.38 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.iOS.Tests/Controls.TestCases.iOS.Tests.csproj (in 6.21 sec).
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
Controls.CustomAttributes -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.CustomAttributes/Debug/net10.0/Controls.CustomAttributes.dll
Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
UITest.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.Core/Debug/net10.0/UITest.Core.dll
VisualTestUtils -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/VisualTestUtils/Debug/netstandard2.0/VisualTestUtils.dll
UITest.NUnit -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.NUnit/Debug/net10.0/UITest.NUnit.dll
VisualTestUtils.MagickNet -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/VisualTestUtils.MagickNet/Debug/netstandard2.0/VisualTestUtils.MagickNet.dll
UITest.Appium -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.Appium/Debug/net10.0/UITest.Appium.dll
UITest.Analyzers -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.Analyzers/Debug/netstandard2.0/UITest.Analyzers.dll
Controls.TestCases.iOS.Tests -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll
Test run for /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (arm64)
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
/Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.05] Discovering: Controls.TestCases.iOS.Tests
[xUnit.net 00:00:00.13] Discovered: Controls.TestCases.iOS.Tests
NUnit Adapter 4.5.0.0: Test execution started
Running selected tests in /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll
NUnit3TestExecutor discovered 1 of 1 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 4/3/2026 7:18:18 AM FixtureSetup for Issue30065(iOS)
>>>>> 4/3/2026 7:18:21 AM ValidateDatePickerFlowDirection Start
>>>>> 4/3/2026 7:18:23 AM ValidateDatePickerFlowDirection Stop
>>>>> 4/3/2026 7:18:23 AM Log types: syslog, crashlog, performance, safariConsole, safariNetwork, server
Failed ValidateDatePickerFlowDirection [2 s]
Error Message:
VisualTestUtils.VisualTestFailedException :
Snapshot different than baseline: ValidateDatePickerFlowDirection.png (2.09% difference)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.
More info: https://aka.ms/visual-test-workflow
Stack Trace:
at VisualTestUtils.VisualRegressionTester.Fail(String message) in /_/src/TestUtils/src/VisualTestUtils/VisualRegressionTester.cs:line 162
at VisualTestUtils.VisualRegressionTester.VerifyMatchesSnapshot(String name, ImageSnapshot actualImage, String environmentName, ITestContext testContext) in /_/src/TestUtils/src/VisualTestUtils/VisualRegressionTester.cs:line 123
at Microsoft.Maui.TestCases.Tests.UITest.<VerifyScreenshot>g__Verify|13_0(String name, <>c__DisplayClass13_0&) in /_/src/Controls/tests/TestCases.Shared.Tests/UITest.cs:line 477
at Microsoft.Maui.TestCases.Tests.UITest.VerifyScreenshot(String name, Nullable`1 retryDelay, Nullable`1 retryTimeout, Int32 cropLeft, Int32 cropRight, Int32 cropTop, Int32 cropBottom, Double tolerance) in /_/src/Controls/tests/TestCases.Shared.Tests/UITest.cs:line 309
at Microsoft.Maui.TestCases.Tests.Issues.Issue30065.ValidateDatePickerFlowDirection() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue30065.cs:line 22
at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
NUnit Adapter 4.5.0.0: Test execution complete
Total tests: 1
Failed: 1
Test Run Failed.
Total time: 1.0128 Minutes
🟢 With fix — 🖥️ Issue30065: PASS ✅ · 88s
Determining projects to restore...
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj (in 349 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 357 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Essentials/src/Essentials.csproj (in 368 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 397 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Core/src/Core.csproj (in 412 ms).
6 of 11 projects are up-to-date for restore.
/Users/cloudtest/vss/_work/1/s/.dotnet/packs/Microsoft.iOS.Sdk.net10.0_26.0/26.0.11017/targets/Xamarin.Shared.Sdk.targets(309,3): warning : RuntimeIdentifier was set on the command line, and will override the value for RuntimeIdentifiers set in the project file. [/Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-ios]
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0-ios26.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0-ios26.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0-ios26.0/Microsoft.Maui.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Maps/Debug/net10.0-ios26.0/Microsoft.Maui.Maps.dll
Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
Microsoft.AspNetCore.Components.WebView.Maui -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Microsoft.AspNetCore.Components.WebView.Maui/Debug/net10.0-ios26.0/Microsoft.AspNetCore.Components.WebView.Maui.dll
Controls.Foldable -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Foldable/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.Foldable.dll
Controls.Xaml -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.Xaml.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
Controls.Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.Maps.dll
Detected signing identity:
Code Signing Key: "" (-)
Provisioning Profile: "" () - no entitlements
Bundle Id: com.microsoft.maui.uitests
App Id: com.microsoft.maui.uitests
Controls.TestCases.HostApp -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-ios/iossimulator-arm64/Controls.TestCases.HostApp.dll
Optimizing assemblies for size may change the behavior of the app. Be sure to test after publishing. See: https://aka.ms/dotnet-illink
Optimizing assemblies for size. This process might take a while.
Build succeeded.
/Users/cloudtest/vss/_work/1/s/.dotnet/packs/Microsoft.iOS.Sdk.net10.0_26.0/26.0.11017/targets/Xamarin.Shared.Sdk.targets(309,3): warning : RuntimeIdentifier was set on the command line, and will override the value for RuntimeIdentifiers set in the project file. [/Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-ios]
1 Warning(s)
0 Error(s)
Time Elapsed 00:00:45.23
Determining projects to restore...
Restored /Users/cloudtest/vss/_work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 332 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj (in 377 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Essentials/src/Essentials.csproj (in 379 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 403 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Core/src/Core.csproj (in 420 ms).
8 of 13 projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
Controls.CustomAttributes -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.CustomAttributes/Debug/net10.0/Controls.CustomAttributes.dll
Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13736351
Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
UITest.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.Core/Debug/net10.0/UITest.Core.dll
VisualTestUtils -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/VisualTestUtils/Debug/netstandard2.0/VisualTestUtils.dll
UITest.Appium -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.Appium/Debug/net10.0/UITest.Appium.dll
UITest.NUnit -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.NUnit/Debug/net10.0/UITest.NUnit.dll
VisualTestUtils.MagickNet -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/VisualTestUtils.MagickNet/Debug/netstandard2.0/VisualTestUtils.MagickNet.dll
UITest.Analyzers -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.Analyzers/Debug/netstandard2.0/UITest.Analyzers.dll
Controls.TestCases.iOS.Tests -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll
Test run for /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (arm64)
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
/Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.04] Discovering: Controls.TestCases.iOS.Tests
[xUnit.net 00:00:00.13] Discovered: Controls.TestCases.iOS.Tests
NUnit Adapter 4.5.0.0: Test execution started
Running selected tests in /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll
NUnit3TestExecutor discovered 1 of 1 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 4/3/2026 7:19:47 AM FixtureSetup for Issue30065(iOS)
>>>>> 4/3/2026 7:19:51 AM ValidateDatePickerFlowDirection Start
>>>>> 4/3/2026 7:19:52 AM ValidateDatePickerFlowDirection Stop
Passed ValidateDatePickerFlowDirection [1 s]
NUnit Adapter 4.5.0.0: Test execution complete
Test Run Successful.
Total tests: 1
Passed: 1
Total time: 17.6654 Seconds
📁 Fix files reverted (9 files)
eng/pipelines/ci-copilot.ymlsrc/Core/src/Handlers/DatePicker/DatePickerHandler.MacCatalyst.cssrc/Core/src/Handlers/DatePicker/DatePickerHandler.cssrc/Core/src/Handlers/DatePicker/DatePickerHandler.iOS.cssrc/Core/src/Platform/iOS/DatePickerExtensions.cssrc/Core/src/PublicAPI/net-ios/PublicAPI.Shipped.txtsrc/Core/src/PublicAPI/net-ios/PublicAPI.Unshipped.txtsrc/Core/src/PublicAPI/net-maccatalyst/PublicAPI.Shipped.txtsrc/Core/src/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt
Note
Are you waiting for the changes in this PR to be merged?
It would be very helpful if you could test the resulting artifacts from this PR and let us know in a comment if this change resolves your issue. Thank you!
Issue Details
Root Cause
Description of Change
Issues Fixed
Fixes #30065
Validated the behaviour in the following platforms
Output
Before.mov
After.mov