[iOS] Fix Editor losing scrollability after rotation when CharacterSpacing is applied - #35309
Conversation
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 35309Or
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 35309" |
MauiBot
left a comment
There was a problem hiding this comment.
Expert Review — 6 findings
See inline comments for details.
There was a problem hiding this comment.
Pull request overview
Fixes an iOS regression where Editor can lose scrollability after device rotation (when CharacterSpacing is applied) by preventing a re-measurement cascade from expanding the native UITextView to its full content height, while still allowing AutoSize=TextChanges editors to grow.
Changes:
- Add an
AllowAutoGrowthflag toMauiTextViewand map it fromEditor.AutoSizeon iOS/MacCatalyst. - Update
EditorHandler.GetDesiredSize(iOS) to cap measured height to the current frame height for “scrollable” editors after rotation-driven cache invalidation. - Add regression coverage via a new Issues UI test and an iOS device test validating
AutoSize=TextChangesstill grows after constraint changes.
Reviewed changes
Copilot reviewed 7 out of 7 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| src/Core/src/Platform/iOS/MauiTextView.cs | Adds AllowAutoGrowth switch used to control whether measurement may exceed the current frame. |
| src/Core/src/Handlers/Editor/EditorHandler.iOS.cs | Caps desired height to preserve scrollability after rotation; also enforces height constraints when SizeThatFits ignores them. |
| src/Controls/src/Core/Editor/Editor.Mapper.cs | Adds iOS/MacCatalyst mapper hook for AutoSize to drive native behavior. |
| src/Controls/src/Core/Editor/Editor.iOS.cs | Implements MapAutoSize to set MauiTextView.AllowAutoGrowth based on Editor.AutoSize. |
| src/Controls/tests/TestCases.HostApp/Issues/Issue35114.cs | Adds a HostApp issue page to reproduce the scenario via slider-driven CharacterSpacing. |
| src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue35114.cs | Adds a UI regression test validating the editor doesn’t grow after rotation. |
| src/Controls/tests/DeviceTests/Elements/Editor/EditorTests.iOS.cs | Adds an iOS device test ensuring AutoSize=TextChanges editors still grow after constraint changes. |
🤖 AI Summary
📊 Review Session —
|
| Test | Without Fix (expect FAIL) | With Fix (expect PASS) |
|---|---|---|
📱 EditorTests (AutoSizeTextChangesEditorGrowsAfterRotation) Category=Editor |
❌ PASS — 440s | ❌ FAIL — 195s |
🖥️ Issue35114 Issue35114 |
✅ FAIL — 136s | ✅ PASS — 96s |
🔴 Without fix — 📱 EditorTests (AutoSizeTextChangesEditorGrowsAfterRotation): PASS ❌ · 440s
(truncated to last 15,000 chars)
ific + 572
�[40m�[37mdbug�[39m�[22m�[49m: frame #7: 0x00000001927ecc78 Foundation`-[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 212
�[40m�[37mdbug�[39m�[22m�[49m: frame #8: 0x00000001928603a4 Foundation`-[NSRunLoop(NSRunLoop) runUntilDate:] + 100
�[40m�[37mdbug�[39m�[22m�[49m: frame #9: 0x0000000104372f28 mlaunch`xamarin_dyn_objc_msgSend + 160
�[40m�[37mdbug�[39m�[22m�[49m: frame #10: 0x00000001078ae68c
�[40m�[37mdbug�[39m�[22m�[49m: frame #11: 0x0000000107c11f68
�[40m�[37mdbug�[39m�[22m�[49m: frame #12: 0x00000001078a8294
�[40m�[37mdbug�[39m�[22m�[49m: frame #13: 0x00000001078410b4
�[40m�[37mdbug�[39m�[22m�[49m: frame #14: 0x000000010705cd54
�[40m�[37mdbug�[39m�[22m�[49m: frame #15: 0x0000000105f5cc04 libcoreclr.dylib`CallDescrWorkerInternal + 132
�[40m�[37mdbug�[39m�[22m�[49m: frame #16: 0x0000000105ddad30 libcoreclr.dylib`MethodDescCallSite::CallTargetWorker(unsigned long long const*, unsigned long long*, int) + 836
�[40m�[37mdbug�[39m�[22m�[49m: frame #17: 0x0000000105ce1350 libcoreclr.dylib`RunMain(MethodDesc*, short, int*, PtrArray**) + 648
�[40m�[37mdbug�[39m�[22m�[49m: frame #18: 0x0000000105ce1688 libcoreclr.dylib`Assembly::ExecuteMainMethod(PtrArray**, int) + 264
�[40m�[37mdbug�[39m�[22m�[49m: frame #19: 0x0000000105d0929c libcoreclr.dylib`CorHost2::ExecuteAssembly(unsigned int, char16_t const*, int, char16_t const**, unsigned int*) + 640
�[40m�[37mdbug�[39m�[22m�[49m: frame #20: 0x0000000105ccf650 libcoreclr.dylib`coreclr_execute_assembly + 232
�[40m�[37mdbug�[39m�[22m�[49m: frame #21: 0x000000010436e140 mlaunch`mono_jit_exec + 204
�[40m�[37mdbug�[39m�[22m�[49m: frame #22: 0x0000000104371ecc mlaunch`xamarin_main + 884
�[40m�[37mdbug�[39m�[22m�[49m: frame #23: 0x00000001043731f4 mlaunch`main + 64
�[40m�[37mdbug�[39m�[22m�[49m: frame #24: 0x0000000190d92b98 dyld`start + 6076
�[40m�[37mdbug�[39m�[22m�[49m: thread #2
�[40m�[37mdbug�[39m�[22m�[49m: frame #0: 0x00000001910f38b0 libsystem_kernel.dylib`__workq_kernreturn + 8
�[40m�[37mdbug�[39m�[22m�[49m: thread #3
�[40m�[37mdbug�[39m�[22m�[49m: frame #0: 0x00000001910f1c34 libsystem_kernel.dylib`mach_msg2_trap + 8
�[40m�[37mdbug�[39m�[22m�[49m: frame #1: 0x00000001911043a0 libsystem_kernel.dylib`mach_msg2_internal + 76
�[40m�[37mdbug�[39m�[22m�[49m: frame #2: 0x00000001910fa764 libsystem_kernel.dylib`mach_msg_overwrite + 484
�[40m�[37mdbug�[39m�[22m�[49m: frame #3: 0x00000001910f1fa8 libsystem_kernel.dylib`mach_msg + 24
�[40m�[37mdbug�[39m�[22m�[49m: frame #4: 0x0000000105ccd2f4 libcoreclr.dylib`MachMessage::Receive(unsigned int) + 80
�[40m�[37mdbug�[39m�[22m�[49m: frame #5: 0x0000000105ccc61c libcoreclr.dylib`SEHExceptionThread(void*) + 164
�[40m�[37mdbug�[39m�[22m�[49m: frame #6: 0x0000000191133bc8 libsystem_pthread.dylib`_pthread_start + 136
�[40m�[37mdbug�[39m�[22m�[49m: thread #4, name = '.NET SynchManager'
�[40m�[37mdbug�[39m�[22m�[49m: frame #0: 0x00000001910f7d04 libsystem_kernel.dylib`kevent + 8
�[40m�[37mdbug�[39m�[22m�[49m: frame #1: 0x0000000105cc1304 libcoreclr.dylib`CorUnix::CPalSynchronizationManager::ReadBytesFromProcessPipe(int, unsigned char*, int) + 484
�[40m�[37mdbug�[39m�[22m�[49m: frame #2: 0x0000000105cc09f0 libcoreclr.dylib`CorUnix::CPalSynchronizationManager::WorkerThread(void*) + 164
�[40m�[37mdbug�[39m�[22m�[49m: frame #3: 0x0000000105cca0fc libcoreclr.dylib`CorUnix::CPalThread::ThreadEntry(void*) + 364
�[40m�[37mdbug�[39m�[22m�[49m: frame #4: 0x0000000191133bc8 libsystem_pthread.dylib`_pthread_start + 136
�[40m�[37mdbug�[39m�[22m�[49m: thread #5, name = '.NET EventPipe'
�[40m�[37mdbug�[39m�[22m�[49m: frame #0: 0x00000001910fa498 libsystem_kernel.dylib`poll + 8
�[40m�[37mdbug�[39m�[22m�[49m: frame #1: 0x0000000105fbce90 libcoreclr.dylib`ds_ipc_poll(_DiagnosticsIpcPollHandle*, unsigned long, unsigned int, void (*)(char const*, unsigned int)) + 172
�[40m�[37mdbug�[39m�[22m�[49m: frame #2: 0x000000010606abb0 libcoreclr.dylib`ds_ipc_stream_factory_get_next_available_stream(void (*)(char const*, unsigned int)) + 756
�[40m�[37mdbug�[39m�[22m�[49m: frame #3: 0x0000000106068a68 libcoreclr.dylib`server_thread(void*) + 372
�[40m�[37mdbug�[39m�[22m�[49m: frame #4: 0x0000000105cca0fc libcoreclr.dylib`CorUnix::CPalThread::ThreadEntry(void*) + 364
�[40m�[37mdbug�[39m�[22m�[49m: frame #5: 0x0000000191133bc8 libsystem_pthread.dylib`_pthread_start + 136
�[40m�[37mdbug�[39m�[22m�[49m: thread #6, name = '.NET DebugPipe'
�[40m�[37mdbug�[39m�[22m�[49m: frame #0: 0x00000001910f2678 libsystem_kernel.dylib`__open + 8
�[40m�[37mdbug�[39m�[22m�[49m: frame #1: 0x00000001910fd6a4 libsystem_kernel.dylib`open + 64
�[40m�[37mdbug�[39m�[22m�[49m: frame #2: 0x0000000105fbda84 libcoreclr.dylib`TwoWayPipe::WaitForConnection() + 40
�[40m�[37mdbug�[39m�[22m�[49m: frame #3: 0x0000000105fb8578 libcoreclr.dylib`DbgTransportSession::TransportWorker() + 232
�[40m�[37mdbug�[39m�[22m�[49m: frame #4: 0x0000000105fb75c8 libcoreclr.dylib`DbgTransportSession::TransportWorkerStatic(void*) + 40
�[40m�[37mdbug�[39m�[22m�[49m: frame #5: 0x0000000105cca0fc libcoreclr.dylib`CorUnix::CPalThread::ThreadEntry(void*) + 364
�[40m�[37mdbug�[39m�[22m�[49m: frame #6: 0x0000000191133bc8 libsystem_pthread.dylib`_pthread_start + 136
�[40m�[37mdbug�[39m�[22m�[49m: thread #7, name = '.NET Debugger'
�[40m�[37mdbug�[39m�[22m�[49m: frame #0: 0x00000001910f53cc libsystem_kernel.dylib`__psynch_cvwait + 8
�[40m�[37mdbug�[39m�[22m�[49m: frame #1: 0x000000019113409c libsystem_pthread.dylib`_pthread_cond_wait + 984
�[40m�[37mdbug�[39m�[22m�[49m: frame #2: 0x0000000105cbef6c libcoreclr.dylib`CorUnix::CPalSynchronizationManager::ThreadNativeWait(CorUnix::_ThreadNativeWaitData*, unsigned int, CorUnix::ThreadWakeupReason*, unsigned int*) + 320
�[40m�[37mdbug�[39m�[22m�[49m: frame #3: 0x0000000105cbebec libcoreclr.dylib`CorUnix::CPalSynchronizationManager::BlockThread(CorUnix::CPalThread*, unsigned int, bool, bool, CorUnix::ThreadWakeupReason*, unsigned int*) + 380
�[40m�[37mdbug�[39m�[22m�[49m: frame #4: 0x0000000105cc30cc libcoreclr.dylib`CorUnix::InternalWaitForMultipleObjectsEx(CorUnix::CPalThread*, unsigned int, void* const*, int, unsigned int, int, int) + 1600
�[40m�[37mdbug�[39m�[22m�[49m: frame #5: 0x0000000105fb5da8 libcoreclr.dylib`DebuggerRCThread::MainLoop() + 228
�[40m�[37mdbug�[39m�[22m�[49m: frame #6: 0x0000000105fb5c70 libcoreclr.dylib`DebuggerRCThread::ThreadProc() + 256
�[40m�[37mdbug�[39m�[22m�[49m: frame #7: 0x0000000105fb5a24 libcoreclr.dylib`DebuggerRCThread::ThreadProcStatic(void*) + 56
�[40m�[37mdbug�[39m�[22m�[49m: frame #8: 0x0000000105cca0fc libcoreclr.dylib`CorUnix::CPalThread::ThreadEntry(void*) + 364
�[40m�[37mdbug�[39m�[22m�[49m: frame #9: 0x0000000191133bc8 libsystem_pthread.dylib`_pthread_start + 136
�[40m�[37mdbug�[39m�[22m�[49m: thread #8
�[40m�[37mdbug�[39m�[22m�[49m: frame #0: 0x00000001910f53cc libsystem_kernel.dylib`__psynch_cvwait + 8
�[40m�[37mdbug�[39m�[22m�[49m: frame #1: 0x000000019113409c libsystem_pthread.dylib`_pthread_cond_wait + 984
�[40m�[37mdbug�[39m�[22m�[49m: frame #2: 0x0000000105cbef6c libcoreclr.dylib`CorUnix::CPalSynchronizationManager::ThreadNativeWait(CorUnix::_ThreadNativeWaitData*, unsigned int, CorUnix::ThreadWakeupReason*, unsigned int*) + 320
�[40m�[37mdbug�[39m�[22m�[49m: frame #3: 0x0000000105cbebec libcoreclr.dylib`CorUnix::CPalSynchronizationManager::BlockThread(CorUnix::CPalThread*, unsigned int, bool, bool, CorUnix::ThreadWakeupReason*, unsigned int*) + 380
�[40m�[37mdbug�[39m�[22m�[49m: frame #4: 0x0000000105cc30cc libcoreclr.dylib`CorUnix::InternalWaitForMultipleObjectsEx(CorUnix::CPalThread*, unsigned int, void* const*, int, unsigned int, int, int) + 1600
�[40m�[37mdbug�[39m�[22m�[49m: frame #5: 0x0000000105e10078 libcoreclr.dylib`FinalizerThread::WaitForFinalizerEvent(CLREvent*) + 240
�[40m�[37mdbug�[39m�[22m�[49m: frame #6: 0x0000000105e101d8 libcoreclr.dylib`FinalizerThread::FinalizerThreadWorker(void*) + 264
�[40m�[37mdbug�[39m�[22m�[49m: frame #7: 0x0000000105dadfa8 libcoreclr.dylib`ManagedThreadBase_DispatchOuter(ManagedThreadCallState*) + 248
�[40m�[37mdbug�[39m�[22m�[49m: frame #8: 0x0000000105dae48c libcoreclr.dylib`ManagedThreadBase::FinalizerBase(void (*)(void*)) + 36
�[40m�[37mdbug�[39m�[22m�[49m: frame #9: 0x0000000105e10350 libcoreclr.dylib`FinalizerThread::FinalizerThreadStart(void*) + 88
�[40m�[37mdbug�[39m�[22m�[49m: frame #10: 0x0000000105cca0fc libcoreclr.dylib`CorUnix::CPalThread::ThreadEntry(void*) + 364
�[40m�[37mdbug�[39m�[22m�[49m: frame #11: 0x0000000191133bc8 libsystem_pthread.dylib`_pthread_start + 136
�[40m�[37mdbug�[39m�[22m�[49m: thread #9, name = '.NET SigHandler'
�[40m�[37mdbug�[39m�[22m�[49m: frame #0: 0x00000001910f27dc libsystem_kernel.dylib`read + 8
�[40m�[37mdbug�[39m�[22m�[49m: frame #1: 0x000000010442ce98 libSystem.Native.dylib`SignalHandlerLoop + 96
�[40m�[37mdbug�[39m�[22m�[49m: frame #2: 0x0000000191133bc8 libsystem_pthread.dylib`_pthread_start + 136
�[40m�[37mdbug�[39m�[22m�[49m: thread #10
�[40m�[37mdbug�[39m�[22m�[49m: frame #0: 0x00000001910f7d04 libsystem_kernel.dylib`kevent + 8
�[40m�[37mdbug�[39m�[22m�[49m: frame #1: 0x000000010442b4a4 libSystem.Native.dylib`SystemNative_WaitForSocketEvents + 80
�[40m�[37mdbug�[39m�[22m�[49m: frame #2: 0x00000001079bca7c
�[40m�[37mdbug�[39m�[22m�[49m: frame #3: 0x00000001079bc6b4
�[40m�[37mdbug�[39m�[22m�[49m: frame #4: 0x00000001079bc564
�[40m�[37mdbug�[39m�[22m�[49m: frame #5: 0x00000001078a1430
�[40m�[37mdbug�[39m�[22m�[49m: frame #6: 0x00000001078a1218
�[40m�[37mdbug�[39m�[22m�[49m: frame #7: 0x00000001078a1108
�[40m�[37mdbug�[39m�[22m�[49m: frame #8: 0x0000000105f5cc04 libcoreclr.dylib`CallDescrWorkerInternal + 132
�[40m�[37mdbug�[39m�[22m�[49m: frame #9: 0x0000000105dda988 libcoreclr.dylib`DispatchCallSimple(unsigned long*, unsigned int, unsigned long long, unsigned int) + 268
�[40m�[37mdbug�[39m�[22m�[49m: frame #10: 0x0000000105decc6c libcoreclr.dylib`ThreadNative::KickOffThread_Worker(void*) + 148
�[40m�[37mdbug�[39m�[22m�[49m: frame #11: 0x0000000105dadfa8 libcoreclr.dylib`ManagedThreadBase_DispatchOuter(ManagedThreadCallState*) + 248
�[40m�[37mdbug�[39m�[22m�[49m: frame #12: 0x0000000105dae45c libcoreclr.dylib`ManagedThreadBase::KickOff(void (*)(void*), void*) + 32
�[40m�[37mdbug�[39m�[22m�[49m: frame #13: 0x0000000105decd44 libcoreclr.dylib`ThreadNative::KickOffThread(void*) + 172
�[40m�[37mdbug�[39m�[22m�[49m: frame #14: 0x0000000105cca0fc libcoreclr.dylib`CorUnix::CPalThread::ThreadEntry(void*) + 364
�[40m�[37mdbug�[39m�[22m�[49m: frame #15: 0x0000000191133bc8 libsystem_pthread.dylib`_pthread_start + 136
�[40m�[37mdbug�[39m�[22m�[49m: thread #11
�[40m�[37mdbug�[39m�[22m�[49m: frame #0: 0x00000001910f1c34 libsystem_kernel.dylib`mach_msg2_trap + 8
�[40m�[37mdbug�[39m�[22m�[49m: frame #1: 0x00000001911043a0 libsystem_kernel.dylib`mach_msg2_internal + 76
�[40m�[37mdbug�[39m�[22m�[49m: frame #2: 0x00000001910fa764 libsystem_kernel.dylib`mach_msg_overwrite + 484
�[40m�[37mdbug�[39m�[22m�[49m: frame #3: 0x00000001910f1fa8 libsystem_kernel.dylib`mach_msg + 24
�[40m�[37mdbug�[39m�[22m�[49m: frame #4: 0x000000019121ec0c CoreFoundation`__CFRunLoopServiceMachPort + 160
�[40m�[37mdbug�[39m�[22m�[49m: frame #5: 0x000000019121d528 CoreFoundation`__CFRunLoopRun + 1208
�[40m�[37mdbug�[39m�[22m�[49m: frame #6: 0x000000019121c9e8 CoreFoundation`CFRunLoopRunSpecific + 572
�[40m�[37mdbug�[39m�[22m�[49m: frame #7: 0x00000001927ecc78 Foundation`-[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 212
�[40m�[37mdbug�[39m�[22m�[49m: frame #8: 0x0000000104372f28 mlaunch`xamarin_dyn_objc_msgSend + 160
�[40m�[37mdbug�[39m�[22m�[49m: frame #9: 0x0000000107c075ac
�[40m�[37mdbug�[39m�[22m�[49m: frame #10: 0x0000000107c07470
�[40m�[37mdbug�[39m�[22m�[49m: frame #11: 0x0000000107c072a4
�[40m�[37mdbug�[39m�[22m�[49m: frame #12: 0x0000000107c03ea0
�[40m�[37mdbug�[39m�[22m�[49m: frame #13: 0x00000001078a13d8
�[40m�[37mdbug�[39m�[22m�[49m: frame #14: 0x00000001078a1218
�[40m�[37mdbug�[39m�[22m�[49m: frame #15: 0x00000001078a1108
�[40m�[37mdbug�[39m�[22m�[49m: frame #16: 0x0000000105f5cc04 libcoreclr.dylib`CallDescrWorkerInternal + 132
�[40m�[37mdbug�[39m�[22m�[49m: frame #17: 0x0000000105dda988 libcoreclr.dylib`DispatchCallSimple(unsigned long*, unsigned int, unsigned long long, unsigned int) + 268
�[40m�[37mdbug�[39m�[22m�[49m: frame #18: 0x0000000105decc6c libcoreclr.dylib`ThreadNative::KickOffThread_Worker(void*) + 148
�[40m�[37mdbug�[39m�[22m�[49m: frame #19: 0x0000000105dadfa8 libcoreclr.dylib`ManagedThreadBase_DispatchOuter(ManagedThreadCallState*) + 248
�[40m�[37mdbug�[39m�[22m�[49m: frame #20: 0x0000000105dae45c libcoreclr.dylib`ManagedThreadBase::KickOff(void (*)(void*), void*) + 32
�[40m�[37mdbug�[39m�[22m�[49m: frame #21: 0x0000000105decd44 libcoreclr.dylib`ThreadNative::KickOffThread(void*) + 172
�[40m�[37mdbug�[39m�[22m�[49m: frame #22: 0x0000000105cca0fc libcoreclr.dylib`CorUnix::CPalThread::ThreadEntry(void*) + 364
�[40m�[37mdbug�[39m�[22m�[49m: frame #23: 0x0000000191133bc8 libsystem_pthread.dylib`_pthread_start + 136
�[40m�[37mdbug�[39m�[22m�[49m: thread #12
�[40m�[37mdbug�[39m�[22m�[49m: frame #0: 0x00000001910f38b0 libsystem_kernel.dylib`__workq_kernreturn + 8
�[40m�[37mdbug�[39m�[22m�[49m: thread #13, name = 'com.apple.CFSocket.private'
�[40m�[37mdbug�[39m�[22m�[49m: frame #0: 0x00000001910fcc2c libsystem_kernel.dylib`__select + 8
�[40m�[37mdbug�[39m�[22m�[49m: frame #1: 0x0000000191244a80 CoreFoundation`__CFSocketManager + 704
�[40m�[37mdbug�[39m�[22m�[49m: frame #2: 0x0000000191133bc8 libsystem_pthread.dylib`_pthread_start + 136
�[40m�[37mdbug�[39m�[22m�[49m: thread #14
�[40m�[37mdbug�[39m�[22m�[49m: frame #0: 0x0000000000000000
�[40m�[37mdbug�[39m�[22m�[49m: (lldb) detach
�[40m�[37mdbug�[39m�[22m�[49m: Process 9273 detached
�[40m�[37mdbug�[39m�[22m�[49m: (lldb) quit
�[40m�[37mdbug�[39m�[22m�[49m: 9273 Execution timed out after 60 seconds and the process was killed.
�[40m�[37mdbug�[39m�[22m�[49m: Process mlaunch exited with 137
�[40m�[37mdbug�[39m�[22m�[49m: Failed to list crash reports from device.
�[40m�[37mdbug�[39m�[22m�[49m: Test run started but crashed and no test results were reported
�[40m�[37mdbug�[39m�[22m�[49m: No crash reports, waiting 30 seconds for the crash report service...
�[41m�[30mfail�[39m�[22m�[49m: Application test run crashed
Failed to launch the application, please try again. If the problem persists, try rebooting MacOS
�[40m�[32minfo�[39m�[22m�[49m: Uninstalling the application 'com.microsoft.maui.controls.devicetests' from 'iPhone 11 Pro'
�[40m�[37mdbug�[39m�[22m�[49m:
�[40m�[37mdbug�[39m�[22m�[49m: Running /Applications/Xcode_26.1.1.app/Contents/Developer/usr/bin/simctl
�[40m�[37mdbug�[39m�[22m�[49m: An error was encountered processing the command (domain=com.apple.CoreSimulator.SimError, code=405):
�[40m�[37mdbug�[39m�[22m�[49m: Unable to lookup in current state: Shutdown
�[40m�[37mdbug�[39m�[22m�[49m: Process simctl exited with 149
�[41m�[30mfail�[39m�[22m�[49m: Failed to uninstall the app bundle! Check logs for more details!
XHarness exit code: 83 (APP_LAUNCH_FAILURE)
Passed: 0
Failed: 0
Tests completed with exit code: 83
🟢 With fix — 📱 EditorTests (AutoSizeTextChangesEditorGrowsAfterRotation): FAIL ❌ · 195s
Determining projects to restore...
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj (in 2.06 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 2.08 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Essentials/src/Essentials.csproj (in 2.09 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 2.15 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Core/src/Core.csproj (in 2.15 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Core/maps/src/Maps.csproj (in 2.15 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/Maps/src/Controls.Maps.csproj (in 2.15 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Xaml/Controls.Xaml.csproj (in 2.13 sec).
5 of 13 projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14031427
Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Release/net10.0-ios26.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14031427
Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Release/net10.0-ios26.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14031427
Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Release/net10.0-ios26.0/Microsoft.Maui.dll
Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Release/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14031427
TestUtils.DeviceTests -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/TestUtils.DeviceTests/Release/net10.0-ios/Microsoft.Maui.TestUtils.DeviceTests.dll
Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Release/net10.0-ios26.0/Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14031427
Controls.Xaml -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Xaml/Release/net10.0-ios26.0/Microsoft.Maui.Controls.Xaml.dll
TestUtils.DeviceTests.Runners -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/TestUtils.DeviceTests.Runners/Release/net10.0-ios/Microsoft.Maui.TestUtils.DeviceTests.Runners.dll
Core.DeviceTests.Shared -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core.DeviceTests.Shared/Release/net10.0-ios/Microsoft.Maui.DeviceTests.Shared.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14031427
Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Maps/Release/net10.0-ios26.0/Microsoft.Maui.Maps.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14031427
Controls.Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Maps/Release/net10.0-ios26.0/Microsoft.Maui.Controls.Maps.dll
TestUtils.DeviceTests.Runners.SourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/TestUtils.DeviceTests.Runners.SourceGen/Release/netstandard2.0/Microsoft.Maui.TestUtils.DeviceTests.Runners.SourceGen.dll
Detected signing identity:
Code Signing Key: "" (-)
Provisioning Profile: "" () - no entitlements
Bundle Id: com.microsoft.maui.controls.devicetests
App Id: com.microsoft.maui.controls.devicetests
Controls.DeviceTests -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.DeviceTests/Release/net10.0-ios/iossimulator-arm64/Microsoft.Maui.Controls.DeviceTests.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.
IL stripping assemblies
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:02:39.83
[11.0.0-prerelease.26107.1+bfbac237157e59cdbd19334325b2af80bd6e9828] XHarness command issued: apple test --app artifacts/bin/Controls.DeviceTests/Release/net10.0-ios/iossimulator-arm64/Microsoft.Maui.Controls.DeviceTests.app --target ios-simulator-64_18.6 --device 533D0570-314E-4BEC-91E1-5A77923790F8 -o artifacts/log --timeout 01:00:00 -v --set-env=TestFilter=Category=Editor
�[40m�[32minfo�[39m�[22m�[49m: Preparing run for ios-simulator-64_18.6 targeting 533D0570-314E-4BEC-91E1-5A77923790F8
�[40m�[32minfo�[39m�[22m�[49m: Looking for available ios-simulator-64_18.6 simulators..
�[40m�[37mdbug�[39m�[22m�[49m: Looking for available ios-simulator-64_18.6 simulators. Storing logs into list-ios-simulator-64_18.6-20260506_140931.log
�[40m�[32minfo�[39m�[22m�[49m: Found simulator device 'iPhone 11 Pro'
�[40m�[32minfo�[39m�[22m�[49m: Getting app bundle information from '/Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.DeviceTests/Release/net10.0-ios/iossimulator-arm64/Microsoft.Maui.Controls.DeviceTests.app'..
�[40m�[37mdbug�[39m�[22m�[49m:
�[40m�[37mdbug�[39m�[22m�[49m: Running /usr/libexec/PlistBuddy
�[40m�[37mdbug�[39m�[22m�[49m: Process PlistBuddy exited with 0
�[40m�[37mdbug�[39m�[22m�[49m:
�[40m�[37mdbug�[39m�[22m�[49m: Running /usr/libexec/PlistBuddy
�[40m�[37mdbug�[39m�[22m�[49m: Process PlistBuddy exited with 0
�[40m�[37mdbug�[39m�[22m�[49m:
�[40m�[37mdbug�[39m�[22m�[49m: Running /usr/libexec/PlistBuddy
�[40m�[37mdbug�[39m�[22m�[49m: Process PlistBuddy exited with 0
�[40m�[37mdbug�[39m�[22m�[49m:
�[40m�[37mdbug�[39m�[22m�[49m: Running /usr/libexec/PlistBuddy
�[40m�[37mdbug�[39m�[22m�[49m: Process PlistBuddy exited with 0
�[40m�[32minfo�[39m�[22m�[49m: Uninstalling any previous instance of 'com.microsoft.maui.controls.devicetests' from 'iPhone 11 Pro'
�[40m�[37mdbug�[39m�[22m�[49m:
�[40m�[37mdbug�[39m�[22m�[49m: Running /Applications/Xcode_26.1.1.app/Contents/Developer/usr/bin/simctl
�[40m�[37mdbug�[39m�[22m�[49m: Process simctl exited with 0
�[40m�[32minfo�[39m�[22m�[49m: Application 'com.microsoft.maui.controls.devicetests' was uninstalled successfully
�[40m�[32minfo�[39m�[22m�[49m: Installing application 'Microsoft.Maui.Controls.DeviceTests' on 'iPhone 11 Pro'
�[40m�[37mdbug�[39m�[22m�[49m: Installing '/Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.DeviceTests/Release/net10.0-ios/iossimulator-arm64/Microsoft.Maui.Controls.DeviceTests.app' to 'iPhone 11 Pro' (144.22 MB)
�[40m�[37mdbug�[39m�[22m�[49m:
�[40m�[37mdbug�[39m�[22m�[49m: Running /Users/cloudtest/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26107.1/tools/net10.0/any/../../../runtimes/any/native/mlaunch/bin/mlaunch
�[40m�[37mdbug�[39m�[22m�[49m: Using Xcode 26.1.1 found in /Applications/Xcode_26.1.1.app
�[40m�[37mdbug�[39m�[22m�[49m: xcrun simctl list --json --json-output /tmp/tmpjw5x8d.tmp
�[40m�[37mdbug�[39m�[22m�[49m: Xamarin.Hosting: No need to boot (already booted): iPhone 11 Pro
�[40m�[37mdbug�[39m�[22m�[49m: Xamarin.Hosting: Installing on iPhone 11 Pro (533D0570-314E-4BEC-91E1-5A77923790F8) by executing 'xcrun simctl install 533D0570-314E-4BEC-91E1-5A77923790F8 /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.DeviceTests/Release/net10.0-ios/iossimulator-arm64/Microsoft.Maui.Controls.DeviceTests.app'
�[40m�[37mdbug�[39m�[22m�[49m: Xamarin.Hosting: The bundle id com.microsoft.maui.controls.devicetests was successfully installed.
�[40m�[37mdbug�[39m�[22m�[49m: Process mlaunch exited with 0
�[40m�[32minfo�[39m�[22m�[49m: Application 'Microsoft.Maui.Controls.DeviceTests' was installed successfully on 'iPhone 11 Pro'
�[40m�[32minfo�[39m�[22m�[49m: Starting test run for com.microsoft.maui.controls.devicetests..
�[40m�[37mdbug�[39m�[22m�[49m: *** Executing 'Microsoft.Maui.Controls.DeviceTests' on ios-simulator-64_18.6 'iPhone 11 Pro' ***
�[40m�[37mdbug�[39m�[22m�[49m: Test log server listening on: 0.0.0.0:50300
�[40m�[37mdbug�[39m�[22m�[49m: System log for the 'iPhone 11 Pro' simulator is: /Users/cloudtest/Library/Logs/CoreSimulator/533D0570-314E-4BEC-91E1-5A77923790F8/system.log
�[40m�[37mdbug�[39m�[22m�[49m: Simulator 'iPhone 11 Pro' is already booted
�[40m�[37mdbug�[39m�[22m�[49m: Scanning log stream for Microsoft.Maui.Controls.DeviceTests into '/Users/cloudtest/vss/_work/1/s/artifacts/log/Microsoft.Maui.Controls.DeviceTests.log'..
�[40m�[37mdbug�[39m�[22m�[49m:
�[40m�[37mdbug�[39m�[22m�[49m: Running /Applications/Xcode_26.1.1.app/Contents/Developer/usr/bin/simctl
�[40m�[37mdbug�[39m�[22m�[49m: Launching the app
�[40m�[37mdbug�[39m�[22m�[49m:
�[40m�[37mdbug�[39m�[22m�[49m: Running /Users/cloudtest/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26107.1/tools/net10.0/any/../../../runtimes/any/native/mlaunch/bin/mlaunch
�[40m�[37mdbug�[39m�[22m�[49m: Connection from 127.0.0.1:50321 saving logs to /Users/cloudtest/vss/_work/1/s/artifacts/log/test-ios-simulator-64_18.6-20260506_140934.log
�[40m�[37mdbug�[39m�[22m�[49m: Tests have finished executing
�[40m�[37mdbug�[39m�[22m�[49m: Process mlaunch exited with 0
�[40m�[37mdbug�[39m�[22m�[49m: Process simctl exited with 137
�[40m�[37mdbug�[39m�[22m�[49m: Test run completed
�[40m�[37mdbug�[39m�[22m�[49m:
�[40m�[37mdbug�[39m�[22m�[49m: Running /bin/bash
�[40m�[37mdbug�[39m�[22m�[49m: cp: /Users/cloudtest/Library/Developer/CoreSimulator/Devices/533D0570-314E-4BEC-91E1-5A77923790F8/data/Containers/Data/Application/81A98E89-8441-4298-99FD-EC803D90A396/Documents/test-results.xml: No such file or directory
�[40m�[37mdbug�[39m�[22m�[49m: Process bash exited with 1
�[40m�[37mdbug�[39m�[22m�[49m: Test run failed
�[40m�[37mdbug�[39m�[22m�[49m: No crash reports, waiting 5 seconds for the crash report service...
�[40m�[32minfo�[39m�[22m�[49m: Application finished the test run successfully with some failed tests
�[40m�[32minfo�[39m�[22m�[49m: Tests run: 58 Passed: 56 Inconclusive: 0 Failed: 2 Ignored: 0
�[40m�[32minfo�[39m�[22m�[49m: Uninstalling the application 'com.microsoft.maui.controls.devicetests' from 'iPhone 11 Pro'
�[40m�[37mdbug�[39m�[22m�[49m:
�[40m�[37mdbug�[39m�[22m�[49m: Running /Applications/Xcode_26.1.1.app/Contents/Developer/usr/bin/simctl
�[40m�[37mdbug�[39m�[22m�[49m: Process simctl exited with 0
�[40m�[32minfo�[39m�[22m�[49m: Application 'com.microsoft.maui.controls.devicetests' was uninstalled successfully
XHarness exit code: 1 (TESTS_FAILED)
Passed: 114
Failed: 6
Tests completed with exit code: 1
🔴 Without fix — 🖥️ Issue35114: FAIL ✅ · 136s
Determining projects to restore...
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj (in 817 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 822 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Essentials/src/Essentials.csproj (in 849 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Core/src/Core.csproj (in 1.01 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Core/maps/src/Maps.csproj (in 1.01 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Xaml/Controls.Xaml.csproj (in 1.01 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 1.01 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/Maps/src/Controls.Maps.csproj (in 1.03 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/Foldable/src/Controls.Foldable.csproj (in 1.16 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj (in 1.8 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/BlazorWebView/src/Maui/Microsoft.AspNetCore.Components.WebView.Maui.csproj (in 1.81 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.70-ci+azdo.14031427
Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0-ios26.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14031427
Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0-ios26.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14031427
Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0-ios26.0/Microsoft.Maui.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14031427
Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Maps/Debug/net10.0-ios26.0/Microsoft.Maui.Maps.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14031427
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.70-ci+azdo.14031427
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14031427
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14031427
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14031427
Controls.Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.Maps.dll
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
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:50.86
Determining projects to restore...
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/tests/CustomAttributes/Controls.CustomAttributes.csproj (in 578 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 581 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/VisualTestUtils/VisualTestUtils.csproj (in 578 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj (in 578 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/UITest.Core/UITest.Core.csproj (in 578 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Essentials/src/Essentials.csproj (in 32 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 652 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Core/src/Core.csproj (in 674 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/UITest.NUnit/UITest.NUnit.csproj (in 1.4 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/UITest.Appium/UITest.Appium.csproj (in 1.49 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/UITest.Analyzers/UITest.Analyzers.csproj (in 3.16 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/VisualTestUtils.MagickNet/VisualTestUtils.MagickNet.csproj (in 2.71 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.iOS.Tests/Controls.TestCases.iOS.Tests.csproj (in 3.34 sec).
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14031427
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.70-ci+azdo.14031427
Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14031427
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.70-ci+azdo.14031427
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.15] 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
>>>>> 5/6/2026 2:06:31 PM FixtureSetup for Issue35114(iOS)
>>>>> 5/6/2026 2:06:34 PM EditorCanBeScrolledAfterRotation Start
>>>>> 5/6/2026 2:06:38 PM EditorCanBeScrolledAfterRotation Stop
>>>>> 5/6/2026 2:06:38 PM Log types: syslog, crashlog, performance, safariConsole, safariNetwork, server
Failed EditorCanBeScrolledAfterRotation [3 s]
Error Message:
Editor height should not grow after rotation. Before: 34, After: 134
Assert.That(heightAfter, Is.EqualTo(heightBefore).Within(1))
Expected: 34 +/- 1
But was: 134
Off by: -100.0d
Stack Trace:
at Microsoft.Maui.TestCases.Tests.Issues.Issue35114.EditorCanBeScrolledAfterRotation() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue35114.cs:line 53
1) at Microsoft.Maui.TestCases.Tests.Issues.Issue35114.EditorCanBeScrolledAfterRotation() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue35114.cs:line 53
NUnit Adapter 4.5.0.0: Test execution complete
Test Run Failed.
Total tests: 1
Failed: 1
Total time: 48.5954 Seconds
🟢 With fix — 🖥️ Issue35114: PASS ✅ · 96s
Determining projects to restore...
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj (in 2.08 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 2.1 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Essentials/src/Essentials.csproj (in 2.11 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 2.18 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/Maps/src/Controls.Maps.csproj (in 2.18 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Core/src/Core.csproj (in 2.18 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Core/maps/src/Maps.csproj (in 2.14 sec).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Xaml/Controls.Xaml.csproj (in 2.19 sec).
3 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.70-ci+azdo.14031427
Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0-ios26.0/Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14031427
Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0-ios26.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14031427
Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0-ios26.0/Microsoft.Maui.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14031427
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.70-ci+azdo.14031427
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.70-ci+azdo.14031427
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14031427
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14031427
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14031427
Controls.Foldable -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Foldable/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.Foldable.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
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
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.86
Determining projects to restore...
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj (in 347 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 349 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Essentials/src/Essentials.csproj (in 351 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Core/src/Core.csproj (in 316 ms).
Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 384 ms).
8 of 13 projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14031427
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.70-ci+azdo.14031427
Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.70-ci+azdo.14031427
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.70-ci+azdo.14031427
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.05] Discovering: Controls.TestCases.iOS.Tests
[xUnit.net 00:00:00.16] 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
>>>>> 5/6/2026 2:11:22 PM FixtureSetup for Issue35114(iOS)
>>>>> 5/6/2026 2:11:26 PM EditorCanBeScrolledAfterRotation Start
>>>>> 5/6/2026 2:11:30 PM EditorCanBeScrolledAfterRotation Stop
Passed EditorCanBeScrolledAfterRotation [3 s]
NUnit Adapter 4.5.0.0: Test execution complete
Test Run Successful.
Total tests: 1
Passed: 1
Total time: 20.4162 Seconds
⚠️ Failure Details
- ❌ EditorTests (AutoSizeTextChangesEditorGrowsAfterRotation) PASSED without fix (should fail) — tests don't catch the bug
- ❌ EditorTests (AutoSizeTextChangesEditorGrowsAfterRotation) FAILED with fix (should pass)
Device tests: 6 of 120 failed
📁 Fix files reverted (5 files)
eng/pipelines/ci-copilot.ymlsrc/Controls/src/Core/Editor/Editor.Mapper.cssrc/Controls/src/Core/Editor/Editor.iOS.cssrc/Core/src/Handlers/Editor/EditorHandler.iOS.cssrc/Core/src/Platform/iOS/MauiTextView.cs
🧪 UI Tests — Category Detection
Detected UI test categories: Editor,ViewBaseTests
🔍 Pre-Flight — Context & Validation
Issue: #35114 - [.NET 10][iOS] D2 - Editor can't be scrolled after rotating simulator.
PR: #35309 - [iOS] Fix Editor losing scrollability after rotation when CharacterSpacing is applied
Platforms Affected: iOS (and MacCatalyst via #if IOS || MACCATALYST)
Files Changed: 4 implementation, 3 test
Key Findings
- Regression introduced in PR [net10.0] Fix SafeArea management on iOS #30629 which added
ValidateSafeArea()→InvalidateConstraintsCache()inMauiView.LayoutSubviews, clearing_lastMeasuredSize, causingneedsMeasure = trueon rotation. - During re-measurement, Editor's
GetDesiredSizeis called withheightConstraint = Infinity. The original code just usedSizeThatFits.Height, which returns the full content height, causing the Editor to expand and lose scrollability. - Fix adds
AllowAutoGrowthflag toMauiTextViewto distinguish between:- Normal Editor (no AutoSize): should cap height to current frame when content overflows
- AutoSize=TextChanges: should grow freely
MapAutoSizeis added toEditor.iOS.csand registered inEditor.Mapper.csfor iOS/MacCatalyst- A second cap is also added for finite constraints (UITextView.SizeThatFits ignores height argument)
- Test coverage includes: UI test (
Issue35114.cs), Device test (EditorTests.iOS.cs)
Code Review Summary
Verdict: NEEDS_CHANGES
Confidence: high
Errors: 2 | Warnings: 2 | Suggestions: 1
Key code review findings:
- ❌
Bounds.Heightratcheting across rotation cycles —EditorHandler.iOS.cs:72.Bounds.Heightreads the last-arranged value, which shrinks across rotations causing permanent height reduction. Should use a handler-owned_scrollableFrameHeightfield. - ❌ Second cap ignores
AllowAutoGrowthfor finite constraints —EditorHandler.iOS.cs:98. The unconditionalresult.Height > heightConstraintcap fires even forAutoSize=TextChangeseditors in Grid rows, silently preventing growth. Fix: add!PlatformView.AllowAutoGrowthguard. ⚠️ AllowAutoGrowthflag leaks Controls concepts into CoreMauiTextView.cs:101. Any handler subclass or direct Core usage gets height-capping with no escape hatch.⚠️ Missing device test for the actual regression scenario (scrollable AutoSize=Disabled editor not growing after width-constraint cycle).- 💡 Replace
Task.Delay(2000).Wait()with retry loop for height stability inIssue35114.cs:46.
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #35309 | Cap heightConstraint to current frame height when ContentSize.Height > currentHeight and !AllowAutoGrowth; add second cap for finite constraint results |
❌ Gate FAILED | EditorHandler.iOS.cs, MauiTextView.cs, Editor.iOS.cs, Editor.Mapper.cs + 3 test files |
Original PR |
🔬 Code Review — Deep Analysis
Code Review — PR #35309
Independent Assessment
What this changes: On iOS, EditorHandler.GetDesiredSize now caps the measured height to the current frame height when two conditions hold: the editor's content overflows its frame and AllowAutoGrowth is false. A new internal bool AllowAutoGrowth flag on MauiTextView (set by a Controls-layer MapAutoSize mapper) exempts AutoSize=TextChanges editors from the cap. A second unconditional cap is also applied after base.GetDesiredSize to handle the UIScrollView subclass quirk where SizeThatFits ignores its height argument.
Inferred motivation: Something in the layout pipeline (likely cache invalidation on rotation) causes a re-measurement with an infinite height constraint. UITextView.SizeThatFits returns the full content height, expanding a previously-scrollable editor and losing its scroll behaviour. The fix is to detect scrollable state (content overflows frame) and cap the reported desired size to the current frame height.
Reconciliation with PR Narrative
Author claims: The regression was introduced by #30629 (ValidateSafeArea → InvalidateConstraintsCache), which clears the measurement cache on rotation, causing a full re-measure pass with infinite height. SizeThatFits then returns full content height and expands the editor.
Agreement/Disagreement: The root cause analysis is correct and the code matches it. The currentHeight > 0 guard correctly handles the first-time-layout case (no Bounds yet). The AllowAutoGrowth exemption for AutoSize=TextChanges is correctly implemented for the infinite constraint path. Two concrete issues were found in the implementation (see Findings 1 & 2).
Findings
❌ Error — Bounds.Height ratcheting across rotation cycles
src/Core/src/Handlers/Editor/EditorHandler.iOS.cs:72
currentHeight = (double)PlatformView.Bounds.Height reads whatever the platform last arranged the view at — not the intended logical height. After portrait→landscape rotation, if the parent container arranges the editor at a reduced height, Bounds.Height reflects that shorter value. The next portrait remeasure then uses this already-shrunken value as the cap, permanently reducing the editor's height across rotation cycles.
Concrete path: portrait scrollable editor at 150pt (content=200pt) → landscape arrangement at 90pt (narrower window, more lines fit in width, but page gives less height) → Bounds.Height=90 → portrait remeasure caps at 90pt, editor now 60pt shorter than intended.
The fix should persist the scrollable cap in a handler-owned field (_scrollableFrameHeight) updated only on the transition into scrollable state (content overflow detected for the first time), not re-read from Bounds on every measurement call.
❌ Error — Second cap ignores AllowAutoGrowth for finite height constraints
src/Core/src/Handlers/Editor/EditorHandler.iOS.cs:98
The AllowAutoGrowth check at line 80 only guards the double.IsInfinity(heightConstraint) branch. The second unconditional cap at lines 98–101 fires for any finite heightConstraint, including for AutoSize=TextChanges editors in containers that compute finite row heights.
Concrete path: AutoSize=TextChanges editor inside a Grid with RowDefinition Height="*". Grid computes a finite heightConstraint of 200pt. Content is 250pt. base.GetDesiredSize returns 250pt (UITextView ignores height in SizeThatFits). Second cap fires: reports 200pt — editor silently cannot grow even though AllowAutoGrowth=true.
Fix:
if (!PlatformView.AllowAutoGrowth && result.Height > heightConstraint)
{
return new Size(result.Width, heightConstraint);
}⚠️ Warning — Controls-layer concept leaks into Core platform view
src/Core/src/Platform/iOS/MauiTextView.cs:101
AllowAutoGrowth is internal and only settable from Controls.Editor via MapAutoSize. Any code that uses EditorHandler without going through the Controls mapper (direct Core usage, subclassed handlers, Essentials-style custom editors) gets height-capping with no escape hatch.
Consider moving the flag to EditorHandler as a protected bool _allowAutoGrowth field. This keeps MauiTextView free of Controls semantics and lets any handler subclass opt in without needing internal access to the platform view.
⚠️ Warning — Missing regression device test for the actual bug scenario
src/Controls/tests/DeviceTests/Elements/Editor/EditorTests.iOS.cs:67
The device test covers the positive case (AutoSize=TextChanges still grows). The actual regression — a scrollable AutoSize=Disabled editor must NOT grow after measurement-cache invalidation — is covered only by the UI test (Issue35114.cs), which requires real device rotation, runs only on mobile platforms, and is hard to reproduce locally.
Add a companion device test: editor with HeightRequest=80, text that overflows to >80pt, width-constraint cycle (simulates rotation), assert editor.Height remains 80pt throughout.
💡 Suggestion — Replace blocking Task.Delay(2000).Wait() in UI test
src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue35114.cs:46
Task.Delay(2000).Wait() is a synchronous thread-block. On slow CI agents this may be insufficient (flaky); on fast agents it wastes time. App.WaitForElement("TestEditor") on line 48 already covers element availability. Replace with a retry loop that polls for height stability.
Devil's Advocate
On Finding 1 (ratcheting): Could Bounds.Height actually stay stable across rotations? Only if the parent always arranges the editor at the same height regardless of orientation. For editors inside a ScrollView or Grid with a fixed HeightRequest, this would be true — no ratcheting. The bug only manifests when the parent's available height changes with orientation. The scenario is realistic (e.g. editor filling half the screen in a relative layout). The finding stands.
On Finding 2 (second cap): An AutoSize=TextChanges editor in a finite-height container is an unusual configuration, since AutoSize is designed for editors that grow freely. Developers who set both AutoSize=TextChanges and put it in a fixed-height row may not expect growth anyway. However, the cap would also fire for editors in dynamic layouts where the grid row height is Auto or * but happens to resolve to a finite value during the problematic re-measure cycle. The guard is cheap and safe to add.
On CI being green: All required checks pass. The test base confirms the positive path works. But the missing regression device test means the negative path isn't validated in fast CI.
Verdict: NEEDS_CHANGES
Confidence: high
Summary: The root cause analysis and overall approach are correct. The AllowAutoGrowth guard in the infinite-constraint path works as intended, and the test for the AutoSize=TextChanges case is solid. However, two concrete bugs were found: Bounds.Height can ratchet downward across rotation cycles for dynamically-sized editors, and the second unconditional cap bypasses AllowAutoGrowth for editors under finite constraints, which can silently prevent AutoSize=TextChanges from growing in certain layout configurations. Both are straightforward to fix.
🔧 Fix — Analysis & Comparison
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| 1 | try-fix | Override SizeThatFits in MauiTextView to cap at Frame.Size.Height when !AllowAutoGrowth; no GetDesiredSize changes |
✅ PASS | MauiTextView.cs, Editor.iOS.cs, Editor.Mapper.cs, 2x PublicAPI |
Fixes at platform view level |
| 2 | try-fix | Read Frame.Size.Height BEFORE calling SizeThatFits in GetDesiredSize; cap to pre-call frame height |
✅ PASS | EditorHandler.iOS.cs, MauiTextView.cs, Editor.iOS.cs, Editor.Mapper.cs |
Fixes Bounds stale-read ordering |
| 3 | try-fix | Handler-owned AllowAutoGrowth on EditorHandler (not platform view); set via MapAutoSize; Frame.Height cap; guarded 2nd cap |
✅ PASS | EditorHandler.iOS.cs, Editor.iOS.cs, Editor.Mapper.cs |
Cleanest architecture: no Controls leak into Core |
| 4 | try-fix | IAutoSizeAwareEditor interface on Editor; live VirtualView cast in handler; no flag, no mapper; Frame.Height cap; guarded 2nd cap |
✅ PASS | EditorHandler.iOS.cs, Editor.iOS.cs |
Fewest files; pull model; addresses both code-review errors |
| PR | PR #35309 | Cap heightConstraint in GetDesiredSize using Bounds.Height+ContentSize.Height; AllowAutoGrowth on MauiTextView; unconditional 2nd cap |
❌ Gate FAILED | 4 impl + 3 test files | Original PR; 2 code-review ❌ errors |
Cross-Pollination
| Model | Round | New Ideas? | Details |
|---|---|---|---|
| claude-opus-4.6 | 2 | NO NEW IDEAS | Attempt-1 approach exhausts the SizeThatFits override path |
| claude-sonnet-4.6 | 2 | NO NEW IDEAS | Attempt-2 variant already covers pre-call Frame capture |
| gpt-5.3-codex | 2 | NO NEW IDEAS | Attempt-3 handler-field approach is distinct; no further variants |
| gemini-3-pro-preview (claude-sonnet-4.6) | 2 | NO NEW IDEAS | Attempt-4 interface approach is most minimal possible |
Exhausted: Yes
Selected Fix: try-fix-4 (IAutoSizeAwareEditor interface approach) — fewest files changed, eliminates the flag/mapper entirely, addresses both code-review ❌ errors, and uses Frame.Height (not Bounds.Height). Tests pass on first run.
📋 Report — Final Recommendation
⚠️ Final Recommendation: REQUEST CHANGES
Phase Status
| Phase | Status | Notes |
|---|---|---|
| Pre-Flight | ✅ COMPLETE | 7 files changed; iOS rotation bug in EditorHandler |
| Code Review | NEEDS_CHANGES (high) | 2 errors, 2 warnings, 1 suggestion |
| Gate | ❌ FAILED | iOS — tests did not pass with PR's fix |
| Try-Fix | ✅ COMPLETE | 4 attempts, 4 passing |
| Expert Eval (pr-plus-reviewer) | ✅ COMPLETE | Addresses both code-review errors; still flag-on-view architecture |
| Report | ✅ COMPLETE |
Code Review Impact on Try-Fix
The two ❌ Error findings from the code review (Bounds.Height ratchet and unconditional second cap) directly guided the try-fix dimension focus. All 4 models addressed these issues — the first by fixing at the SizeThatFits level (Attempt 1), the second by reading Frame.Height before SizeThatFits (Attempt 2), the third by moving the flag to the handler (Attempt 3), and the fourth by eliminating the flag entirely via a Core-defined interface (Attempt 4). The pr-plus-reviewer candidate applied the minimal code-review fixes to the PR's original architecture. The interface approach in try-fix-4 additionally resolved the MauiTextView.
Comparative Analysis
| Candidate | Gate/Test | Code Review Errors | Files Changed | Architecture Quality | Notes |
|---|---|---|---|---|---|
pr |
❌ FAILED | 2 ❌ errors remain | 7 | Controls leaks into Core MauiTextView; Bounds.Height ratchet; unconditional second cap |
Submitted PR |
pr-plus-reviewer |
0 ❌ errors | 7 | Still leaks AllowAutoGrowth into Core MauiTextView; correct Frame.Height; guarded second cap |
Conservative fix | |
try-fix-1 |
✅ PASS | 0 errors | 5 | Override SizeThatFits in MauiTextView; still leaks Controls flag; adds PublicAPI entry |
Platform-level fix |
try-fix-2 |
✅ PASS | 0 errors | 4 | Same as PR architecture but reads Frame.Height pre-SizeThatFits |
Minimal delta from PR |
try-fix-3 |
✅ PASS | 0 errors | 3 | Handler-owned field; no Controls in Core MauiTextView |
Clean separation |
try-fix-4 |
✅ PASS | 0 errors | 2 | Core-defined interface; pure pull model; no flag anywhere; Frame.Height; guarded second cap |
WINNER |
Summary
PR #35309 addresses a real regression (iOS Editor loses scrollability after rotation) with a correct root cause analysis. However, the gate failed and the implementation has two concrete bugs: Bounds.Height ratchets across rotation cycles for UIScrollView subclasses, and the second unconditional cap prevents AutoSize=TextChanges editors from growing in finite-height containers. The try-fix exploration found four passing alternatives; try-fix-4's IAutoSizeAwareEditor interface approach is the strongest — it addresses both code-review errors, eliminates the Controls-leaking flag from Core, requires the fewest file changes, and uses a pull model that eliminates stale state entirely.
Root Cause
MauiView.LayoutSubviews (added in PR #30629 via ValidateSafeArea → InvalidateConstraintsCache) clears _lastMeasuredSize on rotation. On re-measure, GetDesiredSize receives heightConstraint=Infinity and UITextView.SizeThatFits (a UIScrollView subclass) returns full content height, expanding the editor and losing scrollability.
Fix Quality
The recommended fix (try-fix-4) is superior to the submitted PR because: (1) it uses Frame.Height instead of Bounds.Height, avoiding height ratcheting across rotation cycles; (2) the second cap is guarded by ShouldRestrictHeight, ensuring AutoSize=TextChanges editors work in any layout container; (3) it removes the AllowAutoGrowth flag from MauiTextView entirely, keeping Core free of Controls-layer semantics; (4) it requires only 2 source files changed instead of 4, with the same test coverage.
Selected Fix: try-fix-4 (IAutoSizeAwareEditor interface approach)
MauiBot
left a comment
There was a problem hiding this comment.
🤖 Automated review — alternative fix proposed
The expert-reviewer evaluation compared the PR fix against #4 automatically generated candidates and selected try-fix-4 as the strongest fix.
Why: try-fix-4 IAutoSizeAwareEditor interface passes gate tests, addresses both code-review errors (Bounds.Height ratchet fixed to Frame.Height; unconditional second cap guarded by ShouldRestrictHeight), eliminates AllowAutoGrowth from Core MauiTextView, and only changes 2 source files.
Please consider applying the candidate diff below (or use it as guidance). Once you push an update, this workflow will re-trigger and re-evaluate.
Candidate diff (`try-fix-4`)
diff --git a/src/Controls/src/Core/Editor/Editor.iOS.cs b/src/Controls/src/Core/Editor/Editor.iOS.cs
index 1430b10cb4..57ea6172c7 100644
--- a/src/Controls/src/Core/Editor/Editor.iOS.cs
+++ b/src/Controls/src/Core/Editor/Editor.iOS.cs
@@ -1,8 +1,13 @@
#nullable disable
namespace Microsoft.Maui.Controls
{
- public partial class Editor
+ public partial class Editor : IAutoSizeAwareEditor
{
+ // Implements IAutoSizeAwareEditor (defined in Core/Handlers/Editor/EditorHandler.iOS.cs).
+ // Accessible via InternalsVisibleTo("Microsoft.Maui.Controls") in Core's AssemblyInfo.cs.
+ bool IAutoSizeAwareEditor.ShouldRestrictHeight =>
+ AutoSize != EditorAutoSizeOption.TextChanges;
+
public static void MapText(EditorHandler handler, Editor editor) =>
MapText((IEditorHandler)handler, editor);
diff --git a/src/Controls/tests/DeviceTests/Elements/Editor/EditorTests.iOS.cs b/src/Controls/tests/DeviceTests/Elements/Editor/EditorTests.iOS.cs
index b6bd3764ce..e500cbd547 100644
--- a/src/Controls/tests/DeviceTests/Elements/Editor/EditorTests.iOS.cs
+++ b/src/Controls/tests/DeviceTests/Elements/Editor/EditorTests.iOS.cs
@@ -64,6 +64,56 @@ namespace Microsoft.Maui.DeviceTests
});
}
+ [Fact]
+ [Description("Editor with AutoSize=TextChanges should continue to grow after a simulated rotation (width constraint change)")]
+ public async Task AutoSizeTextChangesEditorGrowsAfterRotation()
+ {
+ // Regression test for https://github.com/dotnet/maui/issues/35114
+ // Verifies that AllowAutoGrowth remains true after a width constraint change
+ // (which is what happens internally during portrait↔landscape rotation).
+ SetupBuilder();
+
+ var editor = new Editor
+ {
+ AutoSize = EditorAutoSizeOption.TextChanges,
+ Text = "Line1\nLine2\nLine3",
+ WidthRequest = 200,
+ };
+
+ var layout = new VerticalStackLayout
+ {
+ WidthRequest = 200,
+ HorizontalOptions = LayoutOptions.Start,
+ VerticalOptions = LayoutOptions.Start,
+ Children = { editor }
+ };
+
+ await AttachAndRun<LayoutHandler>(layout, async (_) =>
+ {
+ var frame = editor.Frame;
+ await WaitForUIUpdate(frame, editor);
+ var heightBeforeRotation = editor.Height;
+
+ // Simulate rotation: portrait → landscape (widen) → portrait (narrow)
+ frame = editor.Frame;
+ layout.WidthRequest = 400;
+ await WaitForUIUpdate(frame, editor);
+
+ frame = editor.Frame;
+ layout.WidthRequest = 200;
+ await WaitForUIUpdate(frame, editor);
+
+ // After simulated rotation, typing more text should still grow the editor
+ frame = editor.Frame;
+ editor.Text += "\nLine4\nLine5\nLine6";
+ await WaitForUIUpdate(frame, editor);
+
+ Assert.True(editor.Height > heightBeforeRotation,
+ $"Editor with AutoSize=TextChanges should still grow after rotation. Before: {heightBeforeRotation}, After: {editor.Height}");
+ });
+ }
+
+
[Category(TestCategory.Editor)]
public class PlaceholderTests : ControlsHandlerTestBase
{
diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue35114.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue35114.cs
new file mode 100644
index 0000000000..cc37199e1f
--- /dev/null
+++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue35114.cs
@@ -0,0 +1,38 @@
+namespace Maui.Controls.Sample.Issues;
+
+[Issue(IssueTracker.Github, 35114, "Editor can not be scrolled after rotating simulator", PlatformAffected.iOS)]
+public class Issue35114 : ContentPage
+{
+ public Issue35114()
+ {
+ Title = "Issue 35114";
+
+ var slider = new Slider
+ {
+ AutomationId = "Slider",
+ Maximum = 300,
+ Minimum = 0
+ };
+
+ var editor = new Editor
+ {
+ AutomationId = "TestEditor",
+ Text = "testing"
+ };
+
+ editor.BindingContext = slider;
+ editor.SetBinding(Editor.CharacterSpacingProperty, new Binding("Value"));
+
+ Content = new VerticalStackLayout
+ {
+ Children =
+ {
+ new Label { Text = "1. Drag the slider to the right to increase character spacing on the Editor." },
+ new Label { Text = "2. Rotate the device to landscape and back to portrait." },
+ new Label { Text = "3. The test fails if the Editor grows to full content height after rotation (it should remain scrollable)." },
+ slider,
+ editor
+ }
+ };
+ }
+}
diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue35114.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue35114.cs
new file mode 100644
index 0000000000..b225f400ae
--- /dev/null
+++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue35114.cs
@@ -0,0 +1,57 @@
+#if IOS || ANDROID // The SetOrientation method is only supported on mobile platforms.
+using NUnit.Framework;
+using UITest.Appium;
+using UITest.Core;
+
+namespace Microsoft.Maui.TestCases.Tests.Issues;
+
+public class Issue35114 : _IssuesUITest
+{
+ public Issue35114(TestDevice device) : base(device)
+ {
+ }
+
+ public override string Issue => "Editor can not be scrolled after rotating simulator";
+
+ [TearDown]
+ public void TearDown()
+ {
+ App.SetOrientationPortrait();
+ }
+
+ [Test]
+ [Category(UITestCategories.Editor)]
+ public void EditorCanBeScrolledAfterRotation()
+ {
+ // Step 1: Wait for slider and drag it to max
+ var sliderRect = App.WaitForElement("Slider").GetRect();
+ App.DragCoordinates(
+ sliderRect.X + 5,
+ sliderRect.Y + sliderRect.Height / 2,
+ sliderRect.X + sliderRect.Width - 5,
+ sliderRect.Y + sliderRect.Height / 2);
+ App.WaitForElement("TestEditor");
+
+ // Step 2: Get editor height before rotation
+ var editorRectBefore = App.WaitForElement("TestEditor").GetRect();
+ var heightBefore = editorRectBefore.Height;
+
+ // Step 3: Rotate to landscape
+ App.SetOrientationLandscape();
+ App.WaitForElement("TestEditor");
+
+ // Step 4: Rotate back to portrait
+ App.SetOrientationPortrait();
+ // Allow time for layout to settle after rotation
+ Task.Delay(2000).Wait();
+ App.WaitForElement("TestEditor");
+
+ // Step 5: Get editor height after rotation — should NOT grow
+ var editorRectAfter = App.WaitForElement("TestEditor").GetRect();
+ var heightAfter = editorRectAfter.Height;
+
+ Assert.That(heightAfter, Is.EqualTo(heightBefore).Within(1),
+ $"Editor height should not grow after rotation. Before: {heightBefore}, After: {heightAfter}");
+ }
+}
+#endif
diff --git a/src/Core/src/Handlers/Editor/EditorHandler.iOS.cs b/src/Core/src/Handlers/Editor/EditorHandler.iOS.cs
index aaf1a2ec7e..5a7cdfb0c9 100644
--- a/src/Core/src/Handlers/Editor/EditorHandler.iOS.cs
+++ b/src/Core/src/Handlers/Editor/EditorHandler.iOS.cs
@@ -7,6 +7,17 @@ using UIKit;
namespace Microsoft.Maui.Handlers
{
+ // Implemented by Controls.Editor to signal whether the editor height should be
+ // capped to its current platform frame height when measured with infinite height.
+ // Core cannot reference Controls, so the interface is defined here and Controls
+ // implements it (allowed via InternalsVisibleTo).
+ internal interface IAutoSizeAwareEditor
+ {
+ // Returns true when the editor should NOT grow past its committed frame height
+ // (i.e. AutoSize != TextChanges). False means the editor may expand freely.
+ bool ShouldRestrictHeight { get; }
+ }
+
public partial class EditorHandler : ViewHandler<IEditor, MauiTextView>
{
readonly MauiTextViewEventProxy _proxy = new();
@@ -69,11 +80,42 @@ namespace Microsoft.Maui.Handlers
if (double.IsInfinity(heightConstraint))
{
- heightConstraint = sizeThatFits.Height;
+ var currentHeight = (double)PlatformView.Frame.Height;
+
+ // When the editor is not in auto-growth mode (AutoSize != TextChanges),
+ // cap the infinite height constraint to the current platform frame height.
+ // This prevents UITextView.SizeThatFits (a UIScrollView subclass that always
+ // returns full content height) from expanding a scrollable editor to its full
+ // content height after cache invalidation on rotation (#35114).
+ // Frame.Height is used rather than Bounds.Height because Bounds can ratchet
+ // across rotation cycles for UIScrollView subclasses.
+ bool restrictHeight = (VirtualView as IAutoSizeAwareEditor)?.ShouldRestrictHeight ?? false;
+ if (restrictHeight
+ && currentHeight > 0
+ && PlatformView.ContentSize.Height > currentHeight)
+ {
+ heightConstraint = currentHeight;
+ }
+ else
+ {
+ heightConstraint = sizeThatFits.Height;
+ }
}
}
- return base.GetDesiredSize(widthConstraint, heightConstraint);
+ var result = base.GetDesiredSize(widthConstraint, heightConstraint);
+
+ // UITextView.SizeThatFits (UIScrollView subclass) ignores the height argument
+ // and always returns full content height. Cap the result to the constraint so
+ // GetDesiredSize honours the caller's height limit, but only when height
+ // restriction is active — AutoSize=TextChanges editors must be allowed to grow.
+ if ((VirtualView as IAutoSizeAwareEditor)?.ShouldRestrictHeight == true
+ && result.Height > heightConstraint)
+ {
+ return new Size(result.Width, heightConstraint);
+ }
+
+ return result;
}
public static void MapText(IEditorHandler handler, IEditor editor)
…acing is applied (#35309) > [!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](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! ### Issue Details On iOS, when an Editor has CharacterSpacing applied through a Slider, the Editor becomes scrollable once the content exceeds its frame size. After rotating the device (portrait → landscape → portrait), the Editor loses scrollability because a re-measurement cascade expands it to the full content height. **Regression PR:** #30629 ### Root Cause PR #30629 added ValidateSafeArea() to MauiView.LayoutSubviews, which calls InvalidateConstraintsCache() during rotation. This clears the measurement cache (_lastMeasuredSize = null), causing HasBeenMeasured() = false and needsMeasure = true for Pages. As a result, a full re-measurement cascade occurs, where the Editor is measured with infinite height. SizeThatFits then returns the full content height (for example, 134px), causing the Editor to grow to fit its content and lose its scrollable behavior. ### Description of Change Updated EditorHandler.GetDesiredSize to cap the measured height to the current frame height when the Editor content exceeds its frame (scrollable state). An AllowAutoGrowth flag was added to MauiTextView so Editors using AutoSize = TextChanges are excluded from the cap and can continue growing to fit their content. ### Issues Fixed Fixes #35114 ### Screenshots | Before Issue Fix | After Issue Fix | |----------|----------| | <video width="300" height="600" src="https://github.com/user-attachments/assets/4f1b08f7-abb2-40ae-84d8-f05cd063339c"> | <video width="300" height="600" src="https://github.com/user-attachments/assets/42850642-087c-4198-91be-fc9b09b8dd43"> |
…hen VerticalTextAlignment is Center or End on iOS and MacCatalyst (#35662) > [!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](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! ### Issue details When an Editor with a HeightRequest is placed inside a VerticalStackLayout on iOS and macOS, setting VerticalTextAlignment to Center or End causes the Editor to render at the wrong height instead of the requested size. The Editor appears significantly shorter than expected, while VerticalTextAlignment.Start renders correctly. This inconsistency makes it impossible to rely on HeightRequest when using vertical text alignment on these platforms. ### Root Cause The issue occurs because of the way UITextView (which is a UIScrollView subclass) interacts with the handler's height measurement logic. When VerticalTextAlignment is set to Center or End, the platform view sets a negative ContentOffset internally to position the text. This negative offset alters the internal scroll state of the UITextView, causing SizeThatFits to return a smaller value than expected. The handler uses this value as a substitute for the infinite height constraint before calling the base size calculation. A cap in the handler then incorrectly clamps the correctly resolved HeightRequest value down to this smaller SizeThatFits-derived value, overriding the developer's intent. ### Description of Change The fix involves introducing a boolean flag heightSubstitutedFromSizeThatFits that tracks whether the height constraint was substituted from a SizeThatFits measurement or from a real upper bound such as Bounds.Height. When the constraint is a real bound (used to preserve Editor scrollability after device rotation), the existing cap is applied as before. When the constraint was derived from SizeThatFits (a content measurement, not a limit), the flag is set and the cap is skipped, allowing the base implementation to return the correct size that already honours HeightRequest via ResolveConstraints. This ensures HeightRequest is respected across all text alignment combinations without breaking the existing scrollability behaviour. ### Regression PR PR #35309 Tested the behavior in the following platforms. - [x] iOS - [x] Mac - [ ] Android - [ ] Windows ### Issues Fixed Fixes #35615 ### Output |Platform|Before|After| |--|--|--| |Mac|<video src="https://github.com/user-attachments/assets/5cf40c1c-429b-4374-82e4-ca815b364d21"> |<video src="https://github.com/user-attachments/assets/aa7885b5-e618-45a9-a5b0-599bcc4697bc">| |iOS|<video src="https://github.com/user-attachments/assets/5e613e0c-eedd-405c-ae1e-dfa9e60e154b">|<video src="https://github.com/user-attachments/assets/74b5d0a6-ea11-46ca-a415-eca08b0212b0">|
…acing is applied (#35309) > [!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](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! ### Issue Details On iOS, when an Editor has CharacterSpacing applied through a Slider, the Editor becomes scrollable once the content exceeds its frame size. After rotating the device (portrait → landscape → portrait), the Editor loses scrollability because a re-measurement cascade expands it to the full content height. **Regression PR:** #30629 ### Root Cause PR #30629 added ValidateSafeArea() to MauiView.LayoutSubviews, which calls InvalidateConstraintsCache() during rotation. This clears the measurement cache (_lastMeasuredSize = null), causing HasBeenMeasured() = false and needsMeasure = true for Pages. As a result, a full re-measurement cascade occurs, where the Editor is measured with infinite height. SizeThatFits then returns the full content height (for example, 134px), causing the Editor to grow to fit its content and lose its scrollable behavior. ### Description of Change Updated EditorHandler.GetDesiredSize to cap the measured height to the current frame height when the Editor content exceeds its frame (scrollable state). An AllowAutoGrowth flag was added to MauiTextView so Editors using AutoSize = TextChanges are excluded from the cap and can continue growing to fit their content. ### Issues Fixed Fixes #35114 ### Screenshots | Before Issue Fix | After Issue Fix | |----------|----------| | <video width="300" height="600" src="https://github.com/user-attachments/assets/4f1b08f7-abb2-40ae-84d8-f05cd063339c"> | <video width="300" height="600" src="https://github.com/user-attachments/assets/42850642-087c-4198-91be-fc9b09b8dd43"> |
…te branch (#35920) > [!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](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! ### Issue Details After PR #35309, the iOS snapshot for EditorScrollingWhenEnclosedInBorder differs from the baseline by approximately 1 px vertically. The Border outline, visible text lines, and scroll thumb endpoints are all shifted by one pixel, causing the exact-match snapshot comparison to fail. **Test name:** EditorScrollingWhenEnclosedInBorder **Cause PR:** #35309 ### Root Cause PR #35309 added a final cap in EditorHandler.GetDesiredSize that clamps result.Height to heightConstraint. PR #35662 narrowed this behavior to skip the SizeThatFits substitution path, but the cap was still applied when the caller provided a finite heightConstraint (for example, when Border measures its child). base.GetDesiredSize correctly returned the requested size, but the final cap reduced the calculated height to the Border's stroke-adjusted constraint, resulting in a 1 px vertical drift. ### Description of Change Added an else branch to the double.IsInfinity(...) check in GetDesiredSize (iOS) to mark caller-provided finite constraints using heightSubstitutedFromSizeThatFits = true. The final height cap now applies only when the height value was substituted internally, restoring the standard MAUI measure behavior for caller-provided constraints while preserving the existing behavior. ### Output | Before Issue Fix | After Issue Fix | |----------|----------| | <img width="350" height="110" src="https://github.com/user-attachments/assets/4f3d5b68-7931-4599-a869-b07c7e3bd521"> | <img width="350" height="110" src="https://github.com/user-attachments/assets/b3c883a5-0c3d-41bd-8fc6-9d127def72b9"> |
…acing is applied (#35309) > [!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](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! ### Issue Details On iOS, when an Editor has CharacterSpacing applied through a Slider, the Editor becomes scrollable once the content exceeds its frame size. After rotating the device (portrait → landscape → portrait), the Editor loses scrollability because a re-measurement cascade expands it to the full content height. **Regression PR:** #30629 ### Root Cause PR #30629 added ValidateSafeArea() to MauiView.LayoutSubviews, which calls InvalidateConstraintsCache() during rotation. This clears the measurement cache (_lastMeasuredSize = null), causing HasBeenMeasured() = false and needsMeasure = true for Pages. As a result, a full re-measurement cascade occurs, where the Editor is measured with infinite height. SizeThatFits then returns the full content height (for example, 134px), causing the Editor to grow to fit its content and lose its scrollable behavior. ### Description of Change Updated EditorHandler.GetDesiredSize to cap the measured height to the current frame height when the Editor content exceeds its frame (scrollable state). An AllowAutoGrowth flag was added to MauiTextView so Editors using AutoSize = TextChanges are excluded from the cap and can continue growing to fit their content. ### Issues Fixed Fixes #35114 ### Screenshots | Before Issue Fix | After Issue Fix | |----------|----------| | <video width="300" height="600" src="https://github.com/user-attachments/assets/4f1b08f7-abb2-40ae-84d8-f05cd063339c"> | <video width="300" height="600" src="https://github.com/user-attachments/assets/42850642-087c-4198-91be-fc9b09b8dd43"> |
…llectionViewItems - Editor cells becoming invisible in CollectionView (CV1) (#36107) <!-- Please let the below note in for people that find this PR --> > [!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](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! <!-- !!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING MAIN. !!!!!!! --> ### Issue details When using an Editor inside a CollectionView with the legacy handler (CV1) on iOS, the Editor cells collapse and become invisible after the user taps on them to begin typing. ### Root Cause of the Regression The issue occurs because of the scrollability cap introduced in EditorHandler.GetDesiredSize by PR [#35309](#35309). This cap was added to prevent Editors from growing unboundedly when AllowAutoGrowth = false. However, the native layout container assigns a transient placeholder height of 1pt directly to MauiTextView.Bounds via UIKit, completely bypassing MAUI's PlatformArrange pipeline. When the keyboard appears and the layout invalidates, GetDesiredSize is called and the cap reads Bounds.Height = 1 > 0 and ContentSize.Height = 36 > 1, both true, so it fires incorrectly, capping every Editor cell to 1pt and making them invisible. ### Description of Change The fix involves overriding PlatformArrange in EditorHandler to track the last MAUI-arranged height in a _lastArrangedHeight field, and using that value instead of PlatformView.Bounds.Height inside the scrollability cap condition. Since the native layout container assigns the placeholder height directly via UIKit without going through PlatformArrange, _lastArrangedHeight remains 0 until MAUI explicitly arranges the view. The cap condition currentHeight > 0 therefore evaluates to false for placeholder frames, skipping the cap automatically. Once MAUI arranges the view with a real height, _lastArrangedHeight is updated and the cap applies correctly for all subsequent measure passes, Editors outside a CollectionView are completely unaffected. **Regression PR:** #35309 ### Issues Fixed **iOS UI Test:** CV1: ShouldIgnoreBottomContentInsetForCollectionViewItems
…acing is applied (#35309) > [!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](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! ### Issue Details On iOS, when an Editor has CharacterSpacing applied through a Slider, the Editor becomes scrollable once the content exceeds its frame size. After rotating the device (portrait → landscape → portrait), the Editor loses scrollability because a re-measurement cascade expands it to the full content height. **Regression PR:** #30629 ### Root Cause PR #30629 added ValidateSafeArea() to MauiView.LayoutSubviews, which calls InvalidateConstraintsCache() during rotation. This clears the measurement cache (_lastMeasuredSize = null), causing HasBeenMeasured() = false and needsMeasure = true for Pages. As a result, a full re-measurement cascade occurs, where the Editor is measured with infinite height. SizeThatFits then returns the full content height (for example, 134px), causing the Editor to grow to fit its content and lose its scrollable behavior. ### Description of Change Updated EditorHandler.GetDesiredSize to cap the measured height to the current frame height when the Editor content exceeds its frame (scrollable state). An AllowAutoGrowth flag was added to MauiTextView so Editors using AutoSize = TextChanges are excluded from the cap and can continue growing to fit their content. ### Issues Fixed Fixes #35114 ### Screenshots | Before Issue Fix | After Issue Fix | |----------|----------| | <video width="300" height="600" src="https://github.com/user-attachments/assets/4f1b08f7-abb2-40ae-84d8-f05cd063339c"> | <video width="300" height="600" src="https://github.com/user-attachments/assets/42850642-087c-4198-91be-fc9b09b8dd43"> |
…acing is applied (#35309) > [!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](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! ### Issue Details On iOS, when an Editor has CharacterSpacing applied through a Slider, the Editor becomes scrollable once the content exceeds its frame size. After rotating the device (portrait → landscape → portrait), the Editor loses scrollability because a re-measurement cascade expands it to the full content height. **Regression PR:** #30629 ### Root Cause PR #30629 added ValidateSafeArea() to MauiView.LayoutSubviews, which calls InvalidateConstraintsCache() during rotation. This clears the measurement cache (_lastMeasuredSize = null), causing HasBeenMeasured() = false and needsMeasure = true for Pages. As a result, a full re-measurement cascade occurs, where the Editor is measured with infinite height. SizeThatFits then returns the full content height (for example, 134px), causing the Editor to grow to fit its content and lose its scrollable behavior. ### Description of Change Updated EditorHandler.GetDesiredSize to cap the measured height to the current frame height when the Editor content exceeds its frame (scrollable state). An AllowAutoGrowth flag was added to MauiTextView so Editors using AutoSize = TextChanges are excluded from the cap and can continue growing to fit their content. ### Issues Fixed Fixes #35114 ### Screenshots | Before Issue Fix | After Issue Fix | |----------|----------| | <video width="300" height="600" src="https://github.com/user-attachments/assets/4f1b08f7-abb2-40ae-84d8-f05cd063339c"> | <video width="300" height="600" src="https://github.com/user-attachments/assets/42850642-087c-4198-91be-fc9b09b8dd43"> |
## What's Coming .NET MAUI inflight/candidate introduces significant improvements across all platforms with focus on quality, performance, and developer experience. This release includes 153 commits with various improvements, bug fixes, and enhancements. ## Activityindicator - [Android] Fix CollectionView ActivityIndicator not animating after header height change by @Vignesh-SF3580 in #35358 <details> <summary>🔧 Fixes</summary> - [CollectionView items fail to update ActivityIndicator state after header height change](#33780) </details> ## Animation - [Android] Fix Shadow property affecting transform matrix. by @Shalini-Ashokan in #32962 <details> <summary>🔧 Fixes</summary> - [[Android] Applying Shadow property affects the properties in Visual Transform Matrix](#32731) </details> ## API - Add delegate-based alert dialog extensibility convention (no public API changes) by @Redth in #35095 <details> <summary>🔧 Fixes</summary> - [Alert/Dialog system (`DisplayAlert`, `DisplayActionSheet`, `DisplayPromptAsync`) needs a public extensibility point](#34104) </details> ## Blazor - [Android] Fix for BlazorWebView predictive back callback blocks Android back-to-home animation by @BagavathiPerumal in #35538 <details> <summary>🔧 Fixes</summary> - [[Android] BlazorWebView predictive back callback blocks Android back-to-home animation](#35397) </details> - [Android] Fix BlazorWebView back callback can swallow the first Back press when its callback is stale-enabled by @devanathan-vaithiyanathan in #35611 <details> <summary>🔧 Fixes</summary> - [[inflight regression] Android BlazorWebView back callback can swallow the first Back press when its callback is stale-enabled](#35573) </details> ## Border - [Windows] Fixed the ContentView clip is not updated when wrapping inside the Border by @Ahamed-Ali in #30408 <details> <summary>🔧 Fixes</summary> - [[Windows] ContentView clip is not updated when wrapping inside the Border](#30404) </details> - Fix Border.StrokeDashArray leaks dashed Borders when using a shared Application resource by @devanathan-vaithiyanathan in #35544 <details> <summary>🔧 Fixes</summary> - [`Border.StrokeDashArray` leaks dashed Borders when using a shared Application resource](#35492) </details> - [Windows] Border: Add AutomationPeer support by @Vignesh-SF3580 in #35577 <details> <summary>🔧 Fixes</summary> - [Adding AutomationPeers to Windows Borders](#27627) </details> - [Windows] Fixed BoxView improper rendering inside Border by @Dhivya-SF4094 in #28465 <details> <summary>🔧 Fixes</summary> - [[Windows] Issues with BoxView Placement Inside Border](#19668) </details> ## Button - Prevent NullReferenceException in LayoutButton by @GamesAgeddon in #35284 <details> <summary>🔧 Fixes</summary> - [NullReferenceException on iOS in Button.LayoutButton from WrapperView.LayoutSubviews](#31048) </details> - Fix TextColor null reset to restore platform defaults on iOS and Android by @Shalini-Ashokan in #35563 <details> <summary>🔧 Fixes</summary> - [[Windows, Android, iOS & Mac]Button TextColor does not restore to platform default when reset to null after dynamic update](#35513) </details> ## CollectionView - Fix CollectionView grid spacing updates for first row and column by @KarthikRajaKalaimani in #34527 <details> <summary>🔧 Fixes</summary> - [[MAUI] I2_Vertical grid for horizontal Item Spacing and Vertical Item Spacing - horizontally updating the spacing only applies to the second column](#34257) </details> - [MacCatalyst] Fix CollectionView Header/Footer Not Expanding to Content Width by @KarthikRajaKalaimani in #35213 <details> <summary>🔧 Fixes</summary> - [[MacOS][CV2] I8_View header and footer_Horizontal_View - Footer on the right doesn't adapt when resizing the window](#35113) </details> - [iOS/MacCatalyst] Fix IndicatorView not updating when IndicatorSize is changed to default value by @Shalini-Ashokan in #35215 <details> <summary>🔧 Fixes</summary> - [[iOS/MacCatalyst] IndicatorView does not update when IndicatorSize is dynamically changed to the default value](#35214) </details> - CollectionView selecteditem background lost if collectionview (or parent) IsEnabled changed. by @KarthikRajaKalaimani in #31540 <details> <summary>🔧 Fixes</summary> - [CollectionView selecteditem background lost if collectionview (or parent) IsEnabled changed.](#20615) </details> - [iOS/macOS] CollectionView: Fix FlowDirection not working on EmptyView by @Dhivya-SF4094 in #32674 <details> <summary>🔧 Fixes</summary> - [[iOS, MacOS] FlowDirection not working on EmptyView in CollectionView](#32404) - [[iOS, Mac] CollectionView EmptyViewTemplate content text is mirrored when FlowDirection is RightToLeft](#34522) </details> - Fix iOS CollectionView stale layout invalidations by @filipnavara in #35245 <details> <summary>🔧 Fixes</summary> - [[iOS] CollectionView tries to invalidate cells with invalid indexes](#35244) </details> - Fix Android grouped CollectionView header/footer rebind leak by @AdamEssenmacher in #35368 <details> <summary>🔧 Fixes</summary> - [Memory leak when scrolling a CollectionView with IsGrouped=true](#17698) </details> - [Windows] Fix for Item should scrolled based on the GroupHeaderTemplate by @SuthiYuvaraj in #28074 <details> <summary>🔧 Fixes</summary> - [I9_Scroll by object for grouped data - The group name is always pined at the top after clicking 'Scroll to Proboscis Monkey' button](#27922) </details> - [Android] Fix ScrollTo regression when IsGrouped true on CollectionView by @SubhikshaSf4851 in #35356 <details> <summary>🔧 Fixes</summary> - [[10.0.60] ScrollTo(0) not working anymore on CollectionView when IsGrouped="True"](#35313) </details> - [Android] Fix CollectionView scrolling performance regression by @devanathan-vaithiyanathan in #35379 <details> <summary>🔧 Fixes</summary> - [[10.0.60] CollectionView scrolling performance regression](#35344) </details> - Optimize parent dynamic resource refresh by @AdamEssenmacher in #35408 <details> <summary>🔧 Fixes</summary> - [Memory usage increases when scrolling collectionview if resources count is more than 191](#22053) </details> - Fix CI failure for CollectionView Scrolling Feature Tests due to PR #35379 by @devanathan-vaithiyanathan in #35536 - [iOS & Mac] CarouselViewController2 leaks on iOS/MacCatalyst due to unremoved orientation notification observer by @SubhikshaSf4851 in #35532 <details> <summary>🔧 Fixes</summary> - [CarouselViewController2 leaks on iOS/MacCatalyst due to unremoved orientation notification observer](#35472) </details> - Fix CollectionView.SelectedItems leaks popped views when bound to a retained ObservableCollection by @HarishwaranVijayakumar in #35558 <details> <summary>🔧 Fixes</summary> - [`CollectionView.SelectedItems` leaks popped views when bound to a retained `ObservableCollection`](#35497) </details> - Fix for Android - Dynamic Updates to CollectionView Header/Footer and Templates Are Not Displayed by @SuthiYuvaraj in #28904 <details> <summary>🔧 Fixes</summary> - [Android - Dynamic Updates to CollectionView Header/Footer and Templates Are Not Displayed](#28676) </details> - [Windows] Fix CarouselView EmptyView display when filtering to zero items by @Shalini-Ashokan in #29247 <details> <summary>🔧 Fixes</summary> - [[Windows] [Scenario Day] EmptyView using Template displayed at the same time as the content](#7150) </details> - [Android/iOS] Fix IsEnabled=False on CollectionView not working by @devanathan-vaithiyanathan in #27749 <details> <summary>🔧 Fixes</summary> - [[iOS/Android] CollectionView IsEnabled Not Working](#27770) </details> - Fix CarouselView.Loop property does not update dynamically and fails to maintain the scroll position when the loop value is changed at runtime by @devanathan-vaithiyanathan in #29527 <details> <summary>🔧 Fixes</summary> - [[Android] CarouselView.Loop = false causes crash on Android when changed at runtime](#29411) - [Loop Binding in CarouselView Not Updating Dynamically at Runtime](#29449) </details> - [iOS / Mac] Fix CollectionView.ScrollTo(index) silently failing whenIsGrouped="True" by @Dhivya-SF4094 in #35609 <details> <summary>🔧 Fixes</summary> - [CollectionView.ScrollTo(index) doesn't work correctly when IsGrouped="True" on iOS, MacCatalyst, and Windows](#35326) </details> - Fix Android nested carousel scrolling by @AdamEssenmacher in #35656 <details> <summary>🔧 Fixes</summary> - [Vertical scrolling not working for CarouselView and CustomLayouts](#7814) </details> - [Inflight regression] Fixed Test failures ModalTabbedPagePushAsyncShouldOverlayBottomNavigationView and GroupedCollectionViewScrollToIndexScrollsToCorrectItem by @Dhivya-SF4094 in #35823 - Fix CarouselView tests fail in June 8 Candidate by @devanathan-vaithiyanathan in #35825 ## Core - Reduce allocations on AnimationManager by @pictos in #35612 <details> <summary>🔧 Fixes</summary> - [AnimationManager is allocating a lot](#35654) </details> ## Core Lifecycle - Fix device test memory by @pictos in #35487 <details> <summary>🔧 Fixes</summary> - [Memory leak Device.Test pass with false positive](#35485) </details> ## Datepicker - Fix MacCatalyst DatePicker focus handling by @AdamEssenmacher in #35553 <details> <summary>🔧 Fixes</summary> - [[mauipalooza] DatePicker focus only works first time](#5947) </details> ## DateTimePicker - [Android] Fix DatePicker dialog dismisses after the device is rotated by @HarishwaranVijayakumar in #34980 <details> <summary>🔧 Fixes</summary> - [[Android] [Regression] DatePicker dialog dismisses after the device is rotated](#34973) </details> ## Docs - doc: Add paragraph to README.md explaining how to fetch the `maui` project templates by @durandt in #34561 ## Drawing - [Android] Fix LinearGradientBrush rendering as opaque black box by @SubhikshaSf4851 in #35299 <details> <summary>🔧 Fixes</summary> - [[Regression] LinearGradientBrush broken on Android in 10.0.60](#35280) - [10.0.60 breaks transparency on Brushes (on Android?)](#35354) </details> - Fix polygon points collection handler leak by @AdamEssenmacher in #35526 <details> <summary>🔧 Fixes</summary> - [PolygonHandler and PolylineHandler leak when Points is replaced before disconnect](#35387) </details> ## Editor - [iOS] Fix Editor losing scrollability after rotation when CharacterSpacing is applied by @Vignesh-SF3580 in #35309 <details> <summary>🔧 Fixes</summary> - [[.NET 10][iOS] D2 - Editor can't be scrolled after rotating simulator.](#35114) </details> - [Inflight/Candidate][iOS & Mac] Fix for Editor height inconsistency when VerticalTextAlignment is Center or End on iOS and MacCatalyst by @BagavathiPerumal in #35662 <details> <summary>🔧 Fixes</summary> - [[MAUI] D13_Customize_Text_Alignment - Text Editor Height is not consistent](#35615) </details> ## Entry - [iOS/Mac] Fix Entry clear button retaining tint color after TextColor is reset to null by @SyedAbdulAzeemSF4852 in #35177 <details> <summary>🔧 Fixes</summary> - [[iOS/Mac]Entry ClearButtonVisibility color does not reset when TextColor is set to null](#35076) </details> - [iOS/MacCatalyst] Fix Entry clear button appearing dimmed compared to TextColor by @SyedAbdulAzeemSF4852 in #35541 <details> <summary>🔧 Fixes</summary> - [[MacCatalyst] [Entry] ClearButtonVisibility color appears dimmed compared to TextColor](#35517) </details> - Fix pill-shaped focus ring on macOS 26 by @Dhivya-SF4094 in #35393 <details> <summary>🔧 Fixes</summary> - [.Net 10 Picker item not centered and wrong focus outline of Entry on Mac](#34899) </details> - Fix Entry select all text on refocus not working on WinUI by @kubaflo in #35383 ## Essentials - [Android] Fix Capture video crashes after stopping recording on Android 12 by @HarishwaranVijayakumar in #35638 <details> <summary>🔧 Fixes</summary> - [Capture video crashes after stopping recording on Android 12](#28891) </details> - [Essentials] Browser.OpenAsync(External): drop visibility-filtered ResolveActivity pre-check by @Kebechet in #35652 <details> <summary>🔧 Fixes</summary> - [Browser.OpenAsync(External) on Android throws FeatureNotSupportedException for verified App Link owner URLs even with documented <queries> fix applied](#35651) </details> ## Essentials Texttospeech - [Mac, iOS, Windows] Fix for inconsistent Text-to-Speech rate behavior by @HarishwaranVijayakumar in #32850 <details> <summary>🔧 Fixes</summary> - [[Essentials] TTS rate](#32492) </details> ## Flyoutpage - [iOS/Mac] Fix FlyoutPage RTL FlowDirection is not working by @devanathan-vaithiyanathan in #34831 <details> <summary>🔧 Fixes</summary> - [[iOS/Mac] FlyoutPage RTL FlowDirection is not working properly](#34830) </details> - [Android] Fix for Android 16 Back button is not working after command from FlyoutPage by @BagavathiPerumal in #35196 <details> <summary>🔧 Fixes</summary> - [Android: BackButton on Android 16 not working after command from FlyOutPage](#33508) </details> ## Gestures - Fix DragGestureRecognizer.DropCompleted event not firing in Android platform by @KarthikRajaKalaimani in #35179 <details> <summary>🔧 Fixes</summary> - [[Android] DragGestureRecognizer.DropCompleted event not firing](#17554) </details> - Windows: Ensure layouts without background participate in hit testing by @jpd21122012 in #34364 <details> <summary>🔧 Fixes</summary> - [[Windows] TapGestureRecognizer does NOT work on a ContentView without Background](#32279) </details> - [iOS] Fix VoiceOver dropping child labels on layouts with SemanticProperties.Hint or TapGestureRecognizer by @Vignesh-SF3580 in #35590 <details> <summary>🔧 Fixes</summary> - [[iOS] VoiceOver does not correctly describe View with GestureRecognizers](#34380) </details> ## Hybridwebview - Fix RemovePossibleQueryString to also strip URL fragments by @kubaflo in #35551 <details> <summary>🔧 Fixes</summary> - [HybridWebViewQueryStringHelper.RemovePossibleQueryString removes '?' but not other special characters e.g. '#'](#31472) </details> - [Revert] - [Windows] Fix WebView blank rendering when used with HybridWebView by @SubhikshaSf4851 in #35814 ## Image - Avoid image source layout invalidation for fixed-size views by @AdamEssenmacher in #35369 <details> <summary>🔧 Fixes</summary> - [Image source swaps thrash layout under fixed constraints, tanking frame rate when scrolling virtualized collections](#32457) </details> - [Windows] Fix Image layout inconsistency caused by async decode race in GetDesiredSize by @praveenkumarkarunanithi in #34699 <details> <summary>🔧 Fixes</summary> - [[Windows] Image cropping produces inconsistent results when window is minimized or resized](#32393) </details> - [Testing] Include more testing around Windows Image Aspect recent fixes by @kubaflo in #35620 <details> <summary>🔧 Fixes</summary> - [[Testing] Include more testing around Windows Image Aspect recent fixes](#31686) </details> - Revert PR #30068 — Fix FontImageSource centering regression on Windows by @Shalini-Ashokan in #35642 <details> <summary>🔧 Fixes</summary> - [[Windows] Image with FontImageSource is not centered and gets clipped when WidthRequest/HeightRequest equals FontImageSource Size](#35618) </details> - [Android] Fix screenshot from WebView content not working by @kubaflo in #35384 <details> <summary>🔧 Fixes</summary> - [[Android] Loading the captured screenshot from webview content to Image control does not visible](#30010) </details> ## Label - Improve label mapping performance and ensure complete coverage including ToPlatform and subsequent property changes by @Tamilarasan-Paranthaman in #31159 - Fix for Label.FormattedText leaks labels when shared FormattedString is stored in Application.Resources by @BagavathiPerumal in #35582 <details> <summary>🔧 Fixes</summary> - [`Label.FormattedText` leaks labels when shared `FormattedString` is stored in `Application.Resources`](#35495) </details> - [iOS] Fix Label Span formatting test failures on candidate branch by @Vignesh-SF3580 in #35815 ## Layout - [iOS, Mac] Fix Item spacing not properly applied between items in Horizontal LinearItemsLayout by @Dhivya-SF4094 in #35445 <details> <summary>🔧 Fixes</summary> - [[CollectionView2] Item spacing not properly applied between items in Horizontal LinearItemsLayout](#35429) </details> - [Windows] Add Automation Id support for Layouts. by @SubhikshaSf4851 in #35562 <details> <summary>🔧 Fixes</summary> - [[Windows] AutomationId does not work for ContentView, Layouts and controls that inherit them](#4715) </details> - Avoid layout diagnostics allocations without listeners by @AdamEssenmacher in #35475 <details> <summary>🔧 Fixes</summary> - [MAUI 10 layout diagnostics no-consumer path is not zero-allocation](#35473) </details> - [Windows/Android] FlexLayout: Fix wrap misalignment due to floating-point precision by @SuthiYuvaraj in #31341 <details> <summary>🔧 Fixes</summary> - [FlexLayout Wrap Misalignment with Dynamically-Sized Buttons in .NET MAUI](#30957) </details> ## Listview - Fix Binding for ListView.IsRefreshing by @bill2004158 in #28516 <details> <summary>🔧 Fixes</summary> - [Bind ListView.IsRefreshing is not work.](#28514) </details> ## Map - Fix iOS/Catalyst MapPool retention with MapElements by @AdamEssenmacher in #35480 <details> <summary>🔧 Fixes</summary> - [iOS/Mac Catalyst MapHandler leaks MAUI Map views and MapElements through MapPool](#35479) </details> - Fix Android map view lifecycle cleanup by @AdamEssenmacher in #35476 <details> <summary>🔧 Fixes</summary> - [Navigating to a page with Maps multiple times Increase RAM Usage but doesn't reduce it back after navigating back](#15257) </details> - Fix Android map element options retention by @AdamEssenmacher in #35634 <details> <summary>🔧 Fixes</summary> - [[Regression] [Android] [Maps] Map locks up after rendering 50 Polylines](#20502) </details> ## Menubar - [MacCatalyst] Fix KeyboardAccelerator with Cmd+Shift modifiers breaks entire MenuBarItem on Mac Catalyst by @KarthikRajaKalaimani in #35318 <details> <summary>🔧 Fixes</summary> - [[Bug] KeyboardAccelerator with Cmd+Shift modifiers breaks entire MenuBarItem on Mac Catalyst](#35279) </details> ## Navigation - [iOS, Mac] Fix OnBackButtonPressed not invoked for NavigationPage and Shell by @Dhivya-SF4094 in #35072 <details> <summary>🔧 Fixes</summary> - [On Screen Back Button Does Not Fire OnBackButtonPressed in Android](#9095) - [ContentPage's OnBackButtonPressed not invoked on iOS and MacCatalyst](#8296) </details> - Fix Android stale ContainerView root leak by @AdamEssenmacher in #35372 <details> <summary>🔧 Fixes</summary> - [Android: Stale ContainerView retains replaced FlyoutPage graph](#35371) </details> - [Android] Fix for predictive back-to-home animation blocked by unconditional back callback registration by @BagavathiPerumal in #35223 <details> <summary>🔧 Fixes</summary> - [OnBackInvokedCallbacks block back-to-home animation](#34594) - [Migrate to OnBackPressedCallback](#24752) </details> - Revert [Android, iOS] - Flyout icon should remain visible when a page is pushed onto a NavigationPage or Shell page with the back button disabled. by @praveenkumarkarunanithi in #35604 ## Picker - [iOS] Fix Picker CharacterSpacing lost after item selection when Title is set by @SyedAbdulAzeemSF4852 in #34974 <details> <summary>🔧 Fixes</summary> - [[iOS] Picker loses CharacterSpacing after item selection when Title is set](#34971) </details> - [iOS] Fix Picker CharacterSpacing ignored on initial load by @SyedAbdulAzeemSF4852 in #34957 <details> <summary>🔧 Fixes</summary> - [[iOS] Picker ignores CharacterSpacing on initial load](#34955) </details> - [Windows] Fix for Picker CharacterSpacing Not Being Applied to Title and Dropdown Items by @SyedAbdulAzeemSF4852 in #30612 <details> <summary>🔧 Fixes</summary> - [[Windows] Picker CharacterSpacing property not applied to Title and PickerItems text](#30464) </details> - Fix Picker SelectedIndex deferred initialization by @AdamEssenmacher in #35629 <details> <summary>🔧 Fixes</summary> - [Picker Attribute "SelectedIndex" Not being respected on page load on Android?](#9150) </details> ## Progressbar - Fix iOS ProgressBar bounding box by @AdamEssenmacher in #35507 <details> <summary>🔧 Fixes</summary> - [[iOS] ProgressBar and Label don't correctly obey height and width at the core level](#7935) </details> ## RadioButton - [Windows, Android] Fix Border Color and Border Width Not applying for Radio Button by @HarishwaranVijayakumar in #35616 <details> <summary>🔧 Fixes</summary> - [[Windows, Android] Border Color and Border Width Not applying for Radio Button.](#35587) </details> - [inflight/current] Fixes a CS0111 build failure in RadioButton.cs caused by a duplicate OnPropertyChanged override by @HarishwaranVijayakumar in #35631 - Revert - Fix TalkBack not correctly narrating RadioButtons with Content by @devanathan-vaithiyanathan in #35625 <details> <summary>🔧 Fixes</summary> - [[Android] MissingMethodException AccessibilityNodeInfoCompat.set_Checked(bool) on 10.0.70 due to AndroidX.Core 1.17 breaking change](#35584) </details> ## Refreshview - [Windows] Fix RefreshView IsRefreshing property not working while binding by @devanathan-vaithiyanathan in #34845 <details> <summary>🔧 Fixes</summary> - [[Windows] RefreshView IsRefreshing property not working while binding](#30535) </details> - [Android] Fix for RefreshView triggering pull-to-refresh when scrolling inside a WebView with internal scrollable content by @BagavathiPerumal in #34614 <details> <summary>🔧 Fixes</summary> - [[Android] RefreshView triggers pull-to-refresh immediately when scrolling up inside a WebView](#33510) </details> ## SafeArea - [Android] Fix bottom safe area padding dropping to zero when keyboard is shown by @praveenkumarkarunanithi in #35084 <details> <summary>🔧 Fixes</summary> - [[Android] Bottom insets issues when keyboard is shown.](#32871) </details> - Gate SafeArea inset listeners in recycler items by @AdamEssenmacher in #35664 <details> <summary>🔧 Fixes</summary> - [[10.0.60] CollectionView scrolling performance regression](#35344) </details> ## ScrollView - [Windows] Fix COMException when restoring a ScrollView as ContentPage.Content after swapping it out by @Vignesh-SF3580 in #35360 <details> <summary>🔧 Fixes</summary> - [COMException when clone a page's content to a object and set it back later in mainthread on Windows](#35277) </details> - Fix - ScrollView.ScrollToAsync(x, y, animated) doesn't work when called from Page.OnAppearing by @Shalini-Ashokan in #35395 <details> <summary>🔧 Fixes</summary> - [[iOS] ScrollView.ScrollToAsync(x, y, animated) doesn't work when called from Page.OnAppearing](#31177) </details> ## Searchbar - [Android] Fix SearchBar IME full-screen extract mode in landscape orientation by @SubhikshaSf4851 in #35197 <details> <summary>🔧 Fixes</summary> - [[Android] Investigate SearchBar presentation in horizontal screen orientation ](#14708) </details> - [iOS 26] Fix SearchBar layout spacing issues for small HeightRequest values by @devanathan-vaithiyanathan in #35347 <details> <summary>🔧 Fixes</summary> - [Spacing problem with maui 10.0.60 iOS](#35286) </details> ## SearchBar - [Windows] Fix SearchHandler does not focus when ShowSoftInputAsync is called by @praveenkumarkarunanithi in #35079 <details> <summary>🔧 Fixes</summary> - [[Windows] SearchHandler.ShowSoftInputAsync() does not focus the SearchHandler](#34930) </details> ## Shell - Fix Android layout jump when navigating with IME open and NavBarIsVisible=false by @jpd21122012 in #34621 <details> <summary>🔧 Fixes</summary> - [Shell page without NavBar jumping when navigating with keyboard open](#34584) </details> - [Android] Add defensive not null check to SearchHandlerAppearanceTracker.FocusChange by @Transis-Felipe in #29939 - [Android] Fix for Shell colors change before navigation completes on Android in .NET 10 by @BagavathiPerumal in #35295 <details> <summary>🔧 Fixes</summary> - [Shell colors change before navigation completes on Android in .NET 10](#35060) </details> - [Windows] Fix Shell FlyoutItem not taking full width by @SubhikshaSf4851 in #35131 <details> <summary>🔧 Fixes</summary> - [MAUI WinUI Grids don't render properly in flyout menu](#19542) - [[Windows] [.NET 8 RC2] FlyoutItem Backgroundcolor Is not fully displaying](#18238) </details> - [Android, iOS, Catalyst] Fix SearchHandler.BackgroundColor cannot be reset to null by @HarishwaranVijayakumar in #35224 <details> <summary>🔧 Fixes</summary> - [[Android, iOS, Catalyst] SearchHandler.BackgroundColor cannot be reset to null](#35088) </details> - Fix for ApplyQueryAttributes being called on non-destination pages during back navigation by @BagavathiPerumal in #35392 <details> <summary>🔧 Fixes</summary> - [ApplyQueryAttributes gets called for not activated (navigated to) page on back](#35183) </details> - [Android] Fix Shell flyout background to follow Material 3 theme colors by @SyedAbdulAzeemSF4852 in #35148 <details> <summary>🔧 Fixes</summary> - [[Android] Shell Flyout ignores Material 3 surface color when UseMaterial3 is enabled](#35147) </details> - [Android] Fix Shell.FlyoutHeader background incorrect by @SyedAbdulAzeemSF4852 in #35489 <details> <summary>🔧 Fixes</summary> - [[Android] Shell.FlyoutHeader background is incorrect](#35416) </details> - [iOS/MacCatalyst] Fix Shell.BackgroundColor not applied to bottom TabBar by @Shalini-Ashokan in #35545 <details> <summary>🔧 Fixes</summary> - [[MacCatalyst] Shell.BackgroundColor not applied to bottom TabBar](#35380) - [[Catalyst] Shell.TabBarBackgroundColor is not applied](#35381) </details> - [Android] Fix Shell FlyoutIcon tint loss after navigation by @SyedAbdulAzeemSF4852 in #35561 <details> <summary>🔧 Fixes</summary> - [[Android] The flyout icon loses colours](#35390) </details> - [iOS] Fix Shell - opened keyboard on modal page shifts parent page/frame behind modal after update to 10.0.60 by @KarthikRajaKalaimani in #35559 <details> <summary>🔧 Fixes</summary> - [[iOS] Shell - opened keyboard on modal page shifts parent page/frame behind modal after update to 10.0.60](#35401) </details> - Fix intermediate pages not receiving query parameters in multi-page Shell navigation by @mattleibow in #35432 <details> <summary>🔧 Fixes</summary> - [Shell GoToAsync: no way to pass query parameters to intermediate pages in multi-segment navigation](#35107) </details> - [Windows] Fix Shell title bar overlap with window controls in RTL mode by @Shalini-Ashokan in #33109 <details> <summary>🔧 Fixes</summary> - [[Windows] Binding RTL FlowDirection in Shell causes Flyout MenuIcon and native window controls to overlap](#32476) </details> - [macOS] Fix IsEnabled property false not working on MenuBarItem by @devanathan-vaithiyanathan in #35546 <details> <summary>🔧 Fixes</summary> - [[macOS] IsEnabled property false not working on MenuBarItem](#34038) </details> - Fix Android Shell top inset when nav bar is hidden by @ne0rrmatrix in #35555 <details> <summary>🔧 Fixes</summary> - [wrong statusbar height when Android device has a notch](#35103) </details> - Fix Changing Content property of ShellContent doesn't change visual content by @devanathan-vaithiyanathan in #34630 <details> <summary>🔧 Fixes</summary> - [Changing Content property of ShellContent doesn't change visual content. ](#12669) </details> - Fixed a NullReferenceException when starting application with empty shell on Windows by @Shalini-Ashokan in #28879 <details> <summary>🔧 Fixes</summary> - [NullReferenceException when starting application with empty shell on Windows](#21562) - [Using SelectionChangedCommand with CollectionView in Shell.FlyoutContent results in Win32 Unhandled Exception](#10041) </details> ## Slider - [iOS] Slider: Scale ThumbImageSource to match default thumb size by @NirmalKumarYuvaraj in #34184 <details> <summary>🔧 Fixes</summary> - [[Slider] MAUI Slider thumb image is big on android](#13258) </details> ## Stepper - Fix iOS 26 Stepper overlap in landscape by @AdamEssenmacher in #35374 <details> <summary>🔧 Fixes</summary> - [[.NET10] D10-The number and buttons overlap after rotating the simulator.](#35211) </details> ## SwipeView - Fix SwipeViews with invoked properties crash the app in Release mode by @BagavathiPerumal in #35208 <details> <summary>🔧 Fixes</summary> - [[iOS/Catalyst] Swipeviews with invoked properties crash the app in Release](#18055) </details> - Fix SwipeItemView command leak by @AdamEssenmacher in #35510 <details> <summary>🔧 Fixes</summary> - [`SwipeItemView.Command` leaks row views and command parameters through `CanExecuteChanged`](#35498) </details> - [iOS/Android] Fix SwipeItem.IsVisible not refreshing native swipe items when binding changes by @SyedAbdulAzeemSF4852 in #35217 <details> <summary>🔧 Fixes</summary> - [SwipeItem.IsVisible doesn't properly refresh the native swipe items when the binding value changes dynamically](#34832) </details> - Fix SwipeView memory leak when SwipeItems are reused or replaced by @Vignesh-SF3580 in #35539 <details> <summary>🔧 Fixes</summary> - [SwipeView leaks when SwipeItems are reused or replaced](#35481) </details> - Fix SwipeItem IconImageSource color handling and rendering across platforms by @Shalini-Ashokan in #35632 <details> <summary>🔧 Fixes</summary> - [[Android] SwipeItem IconImageSource should allow more configuration](#23074) </details> ## Switch - [Android/Windows] Fix RadioButton gradient not clearing when switching background by @Shalini-Ashokan in #34997 <details> <summary>🔧 Fixes</summary> - [RadioButton Background does not reset when set to null at runtime](#34993) </details> - [Windows] Fix "PlatformView cannot be null here" exception during handler disconnect by @kubaflo in #35314 <details> <summary>🔧 Fixes</summary> - ["PlatformView cannot be null here" Exception in Switch control [Windows]](#27101) </details> - [iOS 26] Fix Switch ThumbColor and OffColor not applied on initial load by @SyedAbdulAzeemSF4852 in #35400 <details> <summary>🔧 Fixes</summary> - [iOS 26 Switch default color for Off and On is incorrect + Off Color is not applied at start + Thumb Colors is not applied](#35257) </details> - [Android] Fix AppBar flicker on CheckBox/Switch toggle with Material 3 by @Dhivya-SF4094 in #35181 <details> <summary>🔧 Fixes</summary> - [[Android] AppBar flicker while changing the CheckBox or Switch state after scrolling in Material 3](#35180) </details> - [Android] Fix Switch Shadow Does Not Follow Thumb when Toggle On or Off by @Dhivya-SF4094 in #35623 <details> <summary>🔧 Fixes</summary> - [[Android] Switch Shadow Does Not Follow Thumb when Toggle On or Off](#30046) </details> ## TabbedPage - [Android] Fix TabbedPage truncating tab titles instead of scrolling by @Shalini-Ashokan in #35086 <details> <summary>🔧 Fixes</summary> - [Maui migrating Xamarin to Maui - Tabbed Page Scroll Issue - Tabs are not scrolling](#16470) </details> - [Android] Fix BottomNavigationView remaining visible for TabbedPage inside modal NavigationPage after PushAsync by @Dhivya-SF4094 in #35359 <details> <summary>🔧 Fixes</summary> - [Android TabbedPage inside Modal Navigation does not overlay BottomNavigationView after PushAsync in .NET MAUI 10.0.60](#35331) </details> - [Android & iOS] TabbedPage leaks with shared GradientBrush. by @SubhikshaSf4851 in #35543 <details> <summary>🔧 Fixes</summary> - [TabbedPage leaks renderer/manager when BarBackground uses shared GradientBrush resource](#35469) </details> ## Templates - Bumps Syncfusion.Maui.Toolkit dependency to version 1.0.10 by @PaulAndersonS in #35608 ## Toolbar - Fix Android app bar inset background coloring by @ne0rrmatrix in #35601 <details> <summary>🔧 Fixes</summary> - [Android Edge-to-Edge: Shell and NavigationPage Top Bar colour is not used for status bar.](#35568) </details> ## Tooling - Add default .gitignore to MAUI project templates by @davidortinau in #34862 <details> <summary>🔧 Fixes</summary> - [Add a gitignore file to the Maui template in VS 2022](#4131) </details> - Fix: Propagate AdditionalProperties from ProjectReference in ResizetizeCollectItems by @mattleibow in #35575 <details> <summary>🔧 Fixes</summary> - [Resizetizer GetMauiItems does not propagate ProjectReference AdditionalProperties](#35574) </details> ## WebView - [Windows] Fix WebView blank rendering when used with HybridWebView by @SubhikshaSf4851 in #35092 <details> <summary>🔧 Fixes</summary> - [[Windows] WebView Regression from NET9 to NET10](#34558) </details> - Fix AOT integration test failures: suppress IL3050/IL2026 for HybridWebViewHandler in AddControlsHandlers by @mattleibow via @Copilot in #34868 - Fix Android activity result callback leak by @AdamEssenmacher in #35436 <details> <summary>🔧 Fixes</summary> - [Android WebView file chooser callbacks leak via ActivityResultCallbackRegistry](#35405) </details> - [Windows] Fix WebView Does Not Inherit App Theme by @devanathan-vaithiyanathan in #35037 <details> <summary>🔧 Fixes</summary> - [WebView on Windows Does Not Inherit App Theme](#34823) </details> - Fix for WebView leaks when reusing a shared WebViewSource by @BagavathiPerumal in #35524 <details> <summary>🔧 Fixes</summary> - [WebView leaks when reusing a shared WebViewSource](#35483) </details> - Destroy Android WebView on handler disconnect by @AdamEssenmacher in #35552 <details> <summary>🔧 Fixes</summary> - [Right way to dispose page with WebView](#18021) </details> ## Xaml - Fix: Enable VisualStateManager to set Style property dynamically by @Shalini-Ashokan in #33389 <details> <summary>🔧 Fixes</summary> - [Setting the `Style` property using the `VisualStateManager` within a Style resource does not work](#17175) </details> - Fix Implicit parameter conversion from integer to byte fails with source generated XAML by @KarthikRajaKalaimani in #35444 <details> <summary>🔧 Fixes</summary> - [Implicit parameter conversion from integer to byte fails with source generated XAML](#35396) </details> <details> <summary>🔧 Infrastructure (3)</summary> - Fix: Build fails when appicon is an empty (but valid) SVG by @Shalini-Ashokan in #35305 <details> <summary>🔧 Fixes</summary> - [Build fails when appicon is an empty (but valid) svg after upgrade to 10.0.60](#35293) </details> - [inflight/current] Fix CS0111 duplicate GetNativeCharacterSpacing in PickerHandlerTests.iOS by @SyedAbdulAzeemSF4852 in #35419 - Update WinAppSDK to 1.8.260508005 by @kubaflo in #35678 </details> <details> <summary>🧪 Testing (3)</summary> - Backport Test Fixes and Snapshots from SR to Inflight Branch by @Tamilarasan-Paranthaman in #35499 - Fix hardcoded version of Microsoft.DotNet.XHarness.TestRunners.Xunit in test projects by @akoeplinger in #29905 - [Testing] Fixed Build error on inflight/ candidate PR 35716 by @HarishKumarSF4517 in #35730 </details> <details> <summary>🏠 Housekeeping (1)</summary> - [HouseKeeping] Fix inconsistant namespace in HostApp by @NirmalKumarYuvaraj in #35210 </details> <details> <summary>📦 Other (8)</summary> - Add .cab and ReconnectModal.razor.js to signing config by @jesuszarate in #35026 - Fix typo in Clipboard.shared.cs by @Deadpikle in #35316 - Fix single modifier for NSMenuItem accelerators by @jeremy-visionaid in #35351 - Avoid unnecessary LINQ enumerations by @jeremy-visionaid in #35272 - [Testing] Replace retryDelay with retryTimeout in UI tests by @kubaflo in #35367 - Replace JavaFinalize() with Dispose(bool) in GenericAnimatorListener by @jonathanpeppers in #35548 - Fix incorrect SDK provisioning commands in integration-tests instructions by @davidnguyen-tech in #34992 - Fix VisualElement.ChangeVisualState() gets stuck in Selected state by @Dhivya-SF4094 in #35421 <details> <summary>🔧 Fixes</summary> - [VisualElement's ChangeVisualState gets stuck in Selected state](#35399) </details> </details> <details> <summary>📝 Issue References</summary> Fixes #4131, Fixes #4715, Fixes #5947, Fixes #7150, Fixes #7814, Fixes #7935, Fixes #8296, Fixes #9095, Fixes #9150, Fixes #10041, Fixes #12669, Fixes #13258, Fixes #14708, Fixes #15257, Fixes #16470, Fixes #17175, Fixes #17554, Fixes #17698, Fixes #18021, Fixes #18055, Fixes #18238, Fixes #19542, Fixes #19668, Fixes #20502, Fixes #20615, Fixes #21562, Fixes #22053, Fixes #23074, Fixes #24752, Fixes #27101, Fixes #27627, Fixes #27770, Fixes #27922, Fixes #28514, Fixes #28676, Fixes #28891, Fixes #29411, Fixes #29449, Fixes #30010, Fixes #30046, Fixes #30404, Fixes #30464, Fixes #30535, Fixes #30957, Fixes #31048, Fixes #31177, Fixes #31472, Fixes #31686, Fixes #32279, Fixes #32393, Fixes #32404, Fixes #32457, Fixes #32476, Fixes #32492, Fixes #32731, Fixes #32871, Fixes #33508, Fixes #33510, Fixes #33780, Fixes #34038, Fixes #34104, Fixes #34257, Fixes #34380, Fixes #34522, Fixes #34558, Fixes #34584, Fixes #34594, Fixes #34823, Fixes #34830, Fixes #34832, Fixes #34899, Fixes #34930, Fixes #34955, Fixes #34971, Fixes #34973, Fixes #34993, Fixes #35060, Fixes #35076, Fixes #35088, Fixes #35103, Fixes #35107, Fixes #35113, Fixes #35114, Fixes #35147, Fixes #35180, Fixes #35183, Fixes #35211, Fixes #35214, Fixes #35244, Fixes #35257, Fixes #35277, Fixes #35279, Fixes #35280, Fixes #35286, Fixes #35293, Fixes #35313, Fixes #35326, Fixes #35331, Fixes #35344, Fixes #35354, Fixes #35371, Fixes #35380, Fixes #35381, Fixes #35387, Fixes #35390, Fixes #35396, Fixes #35397, Fixes #35399, Fixes #35401, Fixes #35405, Fixes #35416, Fixes #35429, Fixes #35469, Fixes #35472, Fixes #35473, Fixes #35479, Fixes #35481, Fixes #35483, Fixes #35485, Fixes #35492, Fixes #35495, Fixes #35497, Fixes #35498, Fixes #35513, Fixes #35517, Fixes #35568, Fixes #35573, Fixes #35574, Fixes #35584, Fixes #35587, Fixes #35615, Fixes #35618, Fixes #35651, Fixes #35654 </details> **Full Changelog**: main...inflight/candidate
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
On iOS, when an Editor has CharacterSpacing applied through a Slider, the Editor becomes scrollable once the content exceeds its frame size. After rotating the device (portrait → landscape → portrait), the Editor loses scrollability because a re-measurement cascade expands it to the full content height.
Regression PR: #30629
Root Cause
PR #30629 added ValidateSafeArea() to MauiView.LayoutSubviews, which calls InvalidateConstraintsCache() during rotation. This clears the measurement cache (_lastMeasuredSize = null), causing HasBeenMeasured() = false and needsMeasure = true for Pages.
As a result, a full re-measurement cascade occurs, where the Editor is measured with infinite height. SizeThatFits then returns the full content height (for example, 134px), causing the Editor to grow to fit its content and lose its scrollable behavior.
Description of Change
Updated EditorHandler.GetDesiredSize to cap the measured height to the current frame height when the Editor content exceeds its frame (scrollable state).
An AllowAutoGrowth flag was added to MauiTextView so Editors using AutoSize = TextChanges are excluded from the cap and can continue growing to fit their content.
Issues Fixed
Fixes #35114
Screenshots
35114BeforeFix.mov
35114AfterFix.mov