From 3266b4faec6c2b95a85bc5dbf44f8a57e973bf57 Mon Sep 17 00:00:00 2001 From: Isabelle Santin Date: Mon, 17 Feb 2025 11:23:53 -0600 Subject: [PATCH] Implement review suggestions for iOS VoiceOver --- src/iOS/Avalonia.iOS/AutomationPeerWrapper.cs | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/iOS/Avalonia.iOS/AutomationPeerWrapper.cs b/src/iOS/Avalonia.iOS/AutomationPeerWrapper.cs index c18467f8bc..830b823889 100644 --- a/src/iOS/Avalonia.iOS/AutomationPeerWrapper.cs +++ b/src/iOS/Avalonia.iOS/AutomationPeerWrapper.cs @@ -61,10 +61,15 @@ namespace Avalonia.iOS self._view.TopLevel.PointToScreen(bounds.TopLeft), self._view.TopLevel.PointToScreen(bounds.BottomRight) ); - self.AccessibilityFrame = new CGRect( + CGRect nativeRect = new CGRect( screenRect.X, screenRect.Y, screenRect.Width, screenRect.Height ); + if (self.AccessibilityFrame != nativeRect) + { + self.AccessibilityFrame = nativeRect; + UIAccessibility.PostNotification(UIAccessibilityPostNotification.LayoutChanged, null); + } } private static void UpdateIsReadOnly(AutomationPeerWrapper self) @@ -85,23 +90,29 @@ namespace Avalonia.iOS if (self.AccessibilityValue != newValue) { self.AccessibilityValue = newValue; - UIAccessibility.PostNotification(UIAccessibilityPostNotification.Announcement, self); + UIAccessibility.PostNotification(UIAccessibilityPostNotification.Announcement, null); } } - private void PeerChildrenChanged(object? sender, EventArgs e) => _view.UpdateChildren(_peer); + private void PeerChildrenChanged(object? sender, EventArgs e) => + UIAccessibility.PostNotification(UIAccessibilityPostNotification.ScreenChanged, null); - private void PeerPropertyChanged(object? sender, AutomationPropertyChangedEventArgs e) => UpdateProperties(e.Property); + private void PeerPropertyChanged(object? sender, AutomationPropertyChangedEventArgs e) => + UpdateProperties(e.Property); private void UpdateProperties(params AutomationProperty[] properties) { - Action? setter = - Delegate.Combine(properties - .Where(s_propertySetters.ContainsKey) - .Select(x => s_propertySetters[x]) - .Distinct() - .ToArray()) as Action; - setter?.Invoke(this); + HashSet> calledSetters = new(); + foreach (AutomationProperty property in properties) + { + if (s_propertySetters.TryGetValue(property, + out Action? setter) && + !calledSetters.Contains(setter)) + { + calledSetters.Add(setter); + setter.Invoke(this); + } + } } public bool UpdatePropertiesIfValid() @@ -255,7 +266,7 @@ namespace Avalonia.iOS scrollProvider.Scroll(verticalAmount, horizontalAmount); if (didScroll) { - UIAccessibility.PostNotification(UIAccessibilityPostNotification.PageScrolled, this); + UIAccessibility.PostNotification(UIAccessibilityPostNotification.PageScrolled, null); return true; } }