From c255539c93cbffec787f2f5bd7167758f19a0007 Mon Sep 17 00:00:00 2001 From: Tamilarasan Paranthaman <93904422+Tamilarasan-Paranthaman@users.noreply.github.com> Date: Tue, 27 May 2025 16:40:59 +0530 Subject: [PATCH 1/4] Fixed UISwitch off-color issue --- .../src/Handlers/Switch/SwitchHandler.iOS.cs | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/Core/src/Handlers/Switch/SwitchHandler.iOS.cs b/src/Core/src/Handlers/Switch/SwitchHandler.iOS.cs index 26f043ffe788..1771064f6f85 100644 --- a/src/Core/src/Handlers/Switch/SwitchHandler.iOS.cs +++ b/src/Core/src/Handlers/Switch/SwitchHandler.iOS.cs @@ -1,5 +1,8 @@ using System; using Microsoft.Maui.Graphics; +using System.Threading.Tasks; +using CoreFoundation; +using Foundation; using ObjCRuntime; using UIKit; using RectangleF = CoreGraphics.CGRect; @@ -60,21 +63,64 @@ class SwitchProxy ISwitch? VirtualView => _virtualView is not null && _virtualView.TryGetTarget(out var v) ? v : null; + NSObject? _willEnterForegroundObserveriOS; + NSObject? _windowDidBecomeKeyObserverMac; + public void Connect(ISwitch virtualView, UISwitch platformView) { _virtualView = new(virtualView); platformView.ValueChanged += OnControlValueChanged; + +#if MACCATALYST + _windowDidBecomeKeyObserverMac = NSNotificationCenter.DefaultCenter.AddObserver( + new NSString("NSWindowDidBecomeKeyNotification"), _ => UpdateTrackOffColor(platformView)); +#elif IOS + _willEnterForegroundObserveriOS = NSNotificationCenter.DefaultCenter.AddObserver( + UIApplication.WillEnterForegroundNotification, _ => UpdateTrackOffColor(platformView)); +#endif + } + + // Ensures the Switch track "OFF" color is updated correctly after system-level UI resets. + // This is necessary because UIKit may re-apply default styles to internal views during certain lifecycle events, + // especially when the app enters the background and returns to the foreground. + void UpdateTrackOffColor(UISwitch platformView) + { + DispatchQueue.MainQueue.DispatchAsync(async () => + { + await Task.Delay(10); // Small delay, necessary to allow UIKit to complete its internal layout and styling processes before re-applying the custom color + + if (!platformView.On) + { + if (VirtualView is ISwitch view && view.TrackColor is not null) + { + platformView.UpdateTrackColor(view); + } + } + }); } public void Disconnect(UISwitch platformView) { platformView.ValueChanged -= OnControlValueChanged; + + if (_willEnterForegroundObserveriOS is not null) + { + NSNotificationCenter.DefaultCenter.RemoveObserver(_willEnterForegroundObserveriOS); + _willEnterForegroundObserveriOS = null; + } + if (_windowDidBecomeKeyObserverMac is not null) + { + NSNotificationCenter.DefaultCenter.RemoveObserver(_windowDidBecomeKeyObserverMac); + _windowDidBecomeKeyObserverMac = null; + } } void OnControlValueChanged(object? sender, EventArgs e) { if (VirtualView is ISwitch virtualView && sender is UISwitch platformView && virtualView.IsOn != platformView.On) + { virtualView.IsOn = platformView.On; + } } } } From cf7679f9c1a9fa62b19cd01ac641a359cdad0f73 Mon Sep 17 00:00:00 2001 From: Tamilarasan Paranthaman <93904422+Tamilarasan-Paranthaman@users.noreply.github.com> Date: Mon, 2 Jun 2025 15:07:38 +0530 Subject: [PATCH 2/4] Added test sample --- .../VerifySwitchOffColorAfterReopeningApp.png | Bin 0 -> 25596 bytes .../TestCases.HostApp/Issues/Issue29768.cs | 49 ++++++++++++++++++ .../Tests/Issues/Issue29768.cs | 28 ++++++++++ .../VerifySwitchOffColorAfterReopeningApp.png | Bin 0 -> 28117 bytes 4 files changed, 77 insertions(+) create mode 100644 src/Controls/tests/TestCases.Android.Tests/snapshots/android/VerifySwitchOffColorAfterReopeningApp.png create mode 100644 src/Controls/tests/TestCases.HostApp/Issues/Issue29768.cs create mode 100644 src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue29768.cs create mode 100644 src/Controls/tests/TestCases.iOS.Tests/snapshots/ios/VerifySwitchOffColorAfterReopeningApp.png diff --git a/src/Controls/tests/TestCases.Android.Tests/snapshots/android/VerifySwitchOffColorAfterReopeningApp.png b/src/Controls/tests/TestCases.Android.Tests/snapshots/android/VerifySwitchOffColorAfterReopeningApp.png new file mode 100644 index 0000000000000000000000000000000000000000..b09bc37b4006184281f61039c82b0231b33a045e GIT binary patch literal 25596 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 + { + switchControl.IsToggled = !switchControl.IsToggled; + }; + + var verticalStackLayout = new VerticalStackLayout() + { + Spacing = 20, + Padding = new Thickness(20), + }; + + verticalStackLayout.Add(defaultOffSwitch); + verticalStackLayout.Add(switchControl); + verticalStackLayout.Add(button); + + Content = verticalStackLayout; + } +} diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue29768.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue29768.cs new file mode 100644 index 000000000000..721b3646ac96 --- /dev/null +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue29768.cs @@ -0,0 +1,28 @@ +#if TEST_FAILS_ON_WINDOWS && TEST_FAILS_ON_CATALYST //The test fails on Windows and MacCatalyst because the BackgroundApp and ForegroundApp method, which is only supported on mobile platforms iOS and Android. +using NUnit.Framework; +using UITest.Appium; +using UITest.Core; + +namespace Microsoft.Maui.TestCases.Tests.Issues; + +public class Issue29768 : _IssuesUITest +{ + public override string Issue => "Switch OffColor not displayed after minimizing and reopening the app"; + + public Issue29768(TestDevice device) + : base(device) + { } + + [Test] + [Category(UITestCategories.Switch)] + public void VerifySwitchOffColorAfterReopeningApp() + { + App.WaitForElement("toggleButton"); + App.Tap("toggleButton"); + App.BackgroundApp(); + App.ForegroundApp(); + + VerifyScreenshot(); + } +} +#endif \ No newline at end of file diff --git a/src/Controls/tests/TestCases.iOS.Tests/snapshots/ios/VerifySwitchOffColorAfterReopeningApp.png b/src/Controls/tests/TestCases.iOS.Tests/snapshots/ios/VerifySwitchOffColorAfterReopeningApp.png new file mode 100644 index 0000000000000000000000000000000000000000..e6a23a3f2b8bd08c78f2d4dd3b89360865059c8f GIT binary patch literal 28117 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 AY5)KL literal 0 HcmV?d00001 From 328771578e03280757028c65954c98b990f02e55 Mon Sep 17 00:00:00 2001 From: Tamilarasan Paranthaman <93904422+Tamilarasan-Paranthaman@users.noreply.github.com> Date: Mon, 2 Jun 2025 20:15:56 +0530 Subject: [PATCH 3/4] UISwitch OffColor changes --- .../src/Handlers/Switch/SwitchHandler.iOS.cs | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Core/src/Handlers/Switch/SwitchHandler.iOS.cs b/src/Core/src/Handlers/Switch/SwitchHandler.iOS.cs index 1771064f6f85..ca2c3cb3028c 100644 --- a/src/Core/src/Handlers/Switch/SwitchHandler.iOS.cs +++ b/src/Core/src/Handlers/Switch/SwitchHandler.iOS.cs @@ -63,8 +63,8 @@ class SwitchProxy ISwitch? VirtualView => _virtualView is not null && _virtualView.TryGetTarget(out var v) ? v : null; - NSObject? _willEnterForegroundObserveriOS; - NSObject? _windowDidBecomeKeyObserverMac; + NSObject? _willEnterForegroundObserver; + NSObject? _windowDidBecomeKeyObserver; public void Connect(ISwitch virtualView, UISwitch platformView) { @@ -72,10 +72,10 @@ public void Connect(ISwitch virtualView, UISwitch platformView) platformView.ValueChanged += OnControlValueChanged; #if MACCATALYST - _windowDidBecomeKeyObserverMac = NSNotificationCenter.DefaultCenter.AddObserver( + _windowDidBecomeKeyObserver = NSNotificationCenter.DefaultCenter.AddObserver( new NSString("NSWindowDidBecomeKeyNotification"), _ => UpdateTrackOffColor(platformView)); #elif IOS - _willEnterForegroundObserveriOS = NSNotificationCenter.DefaultCenter.AddObserver( + _willEnterForegroundObserver = NSNotificationCenter.DefaultCenter.AddObserver( UIApplication.WillEnterForegroundNotification, _ => UpdateTrackOffColor(platformView)); #endif } @@ -87,10 +87,10 @@ void UpdateTrackOffColor(UISwitch platformView) { DispatchQueue.MainQueue.DispatchAsync(async () => { - await Task.Delay(10); // Small delay, necessary to allow UIKit to complete its internal layout and styling processes before re-applying the custom color - if (!platformView.On) { + await Task.Delay(10); // Small delay, necessary to allow UIKit to complete its internal layout and styling processes before re-applying the custom color + if (VirtualView is ISwitch view && view.TrackColor is not null) { platformView.UpdateTrackColor(view); @@ -103,15 +103,15 @@ public void Disconnect(UISwitch platformView) { platformView.ValueChanged -= OnControlValueChanged; - if (_willEnterForegroundObserveriOS is not null) + if (_willEnterForegroundObserver is not null) { - NSNotificationCenter.DefaultCenter.RemoveObserver(_willEnterForegroundObserveriOS); - _willEnterForegroundObserveriOS = null; + NSNotificationCenter.DefaultCenter.RemoveObserver(_willEnterForegroundObserver); + _willEnterForegroundObserver = null; } - if (_windowDidBecomeKeyObserverMac is not null) + if (_windowDidBecomeKeyObserver is not null) { - NSNotificationCenter.DefaultCenter.RemoveObserver(_windowDidBecomeKeyObserverMac); - _windowDidBecomeKeyObserverMac = null; + NSNotificationCenter.DefaultCenter.RemoveObserver(_windowDidBecomeKeyObserver); + _windowDidBecomeKeyObserver = null; } } From 8f614547b269e5cde1bd8fb4c68c4437df0f0237 Mon Sep 17 00:00:00 2001 From: Tamilarasan Paranthaman <93904422+Tamilarasan-Paranthaman@users.noreply.github.com> Date: Thu, 5 Jun 2025 15:21:58 +0530 Subject: [PATCH 4/4] Fixed Memory leak --- .../src/Handlers/Switch/SwitchHandler.iOS.cs | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/Core/src/Handlers/Switch/SwitchHandler.iOS.cs b/src/Core/src/Handlers/Switch/SwitchHandler.iOS.cs index ca2c3cb3028c..65c2294a2471 100644 --- a/src/Core/src/Handlers/Switch/SwitchHandler.iOS.cs +++ b/src/Core/src/Handlers/Switch/SwitchHandler.iOS.cs @@ -63,20 +63,37 @@ class SwitchProxy ISwitch? VirtualView => _virtualView is not null && _virtualView.TryGetTarget(out var v) ? v : null; + WeakReference? _platformView; + + UISwitch? PlatformView => _platformView is not null && _platformView.TryGetTarget(out var p) ? p : null; + NSObject? _willEnterForegroundObserver; NSObject? _windowDidBecomeKeyObserver; public void Connect(ISwitch virtualView, UISwitch platformView) { _virtualView = new(virtualView); + _platformView = new(platformView); platformView.ValueChanged += OnControlValueChanged; #if MACCATALYST _windowDidBecomeKeyObserver = NSNotificationCenter.DefaultCenter.AddObserver( - new NSString("NSWindowDidBecomeKeyNotification"), _ => UpdateTrackOffColor(platformView)); + new NSString("NSWindowDidBecomeKeyNotification"), _ => + { + if (PlatformView is not null) + { + UpdateTrackOffColor(PlatformView); + } + }); #elif IOS _willEnterForegroundObserver = NSNotificationCenter.DefaultCenter.AddObserver( - UIApplication.WillEnterForegroundNotification, _ => UpdateTrackOffColor(platformView)); + UIApplication.WillEnterForegroundNotification, _ => + { + if (PlatformView is not null) + { + UpdateTrackOffColor(PlatformView); + } + }); #endif }