diff --git a/Xamarin.Forms.Platform.iOS/Forms.cs b/Xamarin.Forms.Platform.iOS/Forms.cs index a55dbcee6ce..91c69b6f134 100644 --- a/Xamarin.Forms.Platform.iOS/Forms.cs +++ b/Xamarin.Forms.Platform.iOS/Forms.cs @@ -40,6 +40,7 @@ public static class Forms static bool? s_isiOS12OrNewer; static bool? s_isiOS13OrNewer; static bool? s_isiOS14OrNewer; + static bool? s_isiOS15OrNewer; static bool? s_respondsTosetNeedsUpdateOfHomeIndicatorAutoHidden; internal static bool IsiOS9OrNewer @@ -103,6 +104,16 @@ internal static bool IsiOS14OrNewer } } + internal static bool IsiOS15OrNewer + { + get + { + if (!s_isiOS15OrNewer.HasValue) + s_isiOS15OrNewer = UIDevice.CurrentDevice.CheckSystemVersion(15, 0); + return s_isiOS15OrNewer.Value; + } + } + internal static bool RespondsToSetNeedsUpdateOfHomeIndicatorAutoHidden { diff --git a/Xamarin.Forms.Platform.iOS/Renderers/TimePickerRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/TimePickerRenderer.cs index d363888a1b3..8bdb9906caa 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/TimePickerRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/TimePickerRenderer.cs @@ -56,6 +56,12 @@ protected override void Dispose(bool disposing) { _picker.RemoveFromSuperview(); _picker.ValueChanged -= OnValueChanged; + + if (Forms.IsiOS15OrNewer) + { + _picker.EditingDidBegin -= PickerEditingDidBegin; + } + _picker.Dispose(); _picker = null; } @@ -91,6 +97,11 @@ protected override void OnElementChanged(ElementChangedEventArgs e) _picker.PreferredDatePickerStyle = UIKit.UIDatePickerStyle.Wheels; } + if (Forms.IsiOS15OrNewer) + { + _picker.EditingDidBegin += PickerEditingDidBegin; + } + var width = UIScreen.MainScreen.Bounds.Width; var toolbar = new UIToolbar(new RectangleF(0, 0, width, 44)) { BarStyle = UIBarStyle.Default, Translucent = true }; var spacer = new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace); @@ -162,6 +173,11 @@ void OnStarted(object sender, EventArgs eventArgs) ElementController.SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, true); } + void PickerEditingDidBegin(object sender, EventArgs eventArgs) + { + _picker.ResignFirstResponder(); + } + void OnValueChanged(object sender, EventArgs e) { if (Element.OnThisPlatform().UpdateMode() == UpdateMode.Immediately)