Skip to content
This repository has been archived by the owner on May 1, 2024. It is now read-only.

[iOS] Restore wheels date/time picker styles in 5.0 #13344

Merged
merged 2 commits into from
Jan 10, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions Xamarin.Forms.Platform.iOS.UnitTests/DatePickerTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using System.Threading.Tasks;
using NUnit.Framework;

namespace Xamarin.Forms.Platform.iOS.UnitTests
{
[TestFixture]
public class DatePickerTests : PlatformTestFixture
{
[Test, Category("DatePicker")]
[Description("DatePicker should be using wheels-style picker")]
public async Task UsingWheelPicker()
{
if (!Forms.IsiOS14OrNewer)
{
return;
}

var datePicker = new DatePicker();
var expected = UIKit.UIDatePickerStyle.Wheels;
var actual = await GetControlProperty(datePicker, uiDatePicker => uiDatePicker.PreferredDatePickerStyle);
Assert.That(actual, Is.EqualTo(expected));
}
}
}
71 changes: 71 additions & 0 deletions Xamarin.Forms.Platform.iOS.UnitTests/PlatformTestFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,75 @@ protected async Task<TProperty> GetControlProperty<TProperty>(ImageButton button
});
}

protected UITextField GetNativeControl(DatePicker datePicker)
{
var renderer = GetRenderer(datePicker);
var viewRenderer = renderer.NativeView as DatePickerRenderer;
return viewRenderer.Control;
}

protected UIDatePicker GetPickerControl(DatePicker datePicker)
{
var renderer = GetRenderer(datePicker);
var viewRenderer = renderer.NativeView as DatePickerRenderer;
return viewRenderer.Picker;
}

protected async Task<TProperty> GetControlProperty<TProperty>(DatePicker datePicker, Func<UITextField, TProperty> getProperty)
{
return await Device.InvokeOnMainThreadAsync(() => {
using (var uiTextField = GetNativeControl(datePicker))
{
return getProperty(uiTextField);
}
});
}

protected async Task<TProperty> GetControlProperty<TProperty>(DatePicker datePicker, Func<UIDatePicker, TProperty> getProperty)
{
return await Device.InvokeOnMainThreadAsync(() => {
using (var uiDatePicker = GetPickerControl(datePicker))
{
return getProperty(uiDatePicker);
}
});
}

protected UITextField GetNativeControl(TimePicker timePicker)
{
var renderer = GetRenderer(timePicker);
var viewRenderer = renderer.NativeView as TimePickerRenderer;
return viewRenderer.Control;
}

protected UIDatePicker GetPickerControl(TimePicker timePicker)
{
var renderer = GetRenderer(timePicker);
var viewRenderer = renderer.NativeView as TimePickerRenderer;
return viewRenderer.Picker;
}

protected async Task<TProperty> GetControlProperty<TProperty>(TimePicker timePicker, Func<UITextField, TProperty> getProperty)
{
return await Device.InvokeOnMainThreadAsync(() => {
using (var uiTextField = GetNativeControl(timePicker))
{
return getProperty(uiTextField);
}
});
}

protected async Task<TProperty> GetControlProperty<TProperty>(TimePicker timePicker, Func<UIDatePicker, TProperty> getProperty)
{
return await Device.InvokeOnMainThreadAsync(() => {
using (var uiDatePicker = GetPickerControl(timePicker))
{
return getProperty(uiDatePicker);
}
});
}


protected async Task<TProperty> GetRendererProperty<TProperty>(View view,
Func<IVisualElementRenderer, TProperty> getProperty, bool requiresLayout = false)
{
Expand Down Expand Up @@ -234,5 +303,7 @@ protected bool AreColorsSimilar(UIColor c1, UIColor c2, int tolerance)
Math.Abs(c1G - c2G) < tolerance &&
Math.Abs(c1B - c2B) < tolerance;
}


}
}
24 changes: 24 additions & 0 deletions Xamarin.Forms.Platform.iOS.UnitTests/TimePickerTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using System.Threading.Tasks;
using NUnit.Framework;

namespace Xamarin.Forms.Platform.iOS.UnitTests
{
[TestFixture]
public class TimePickerTests : PlatformTestFixture
{
[Test, Category("TimePicker")]
[Description("TimePicker should be using wheels-style picker")]
public async Task UsingWheelPicker()
{
if (!Forms.IsiOS14OrNewer)
{
return;
}

var timePicker = new TimePicker();
var expected = UIKit.UIDatePickerStyle.Wheels;
var actual = await GetControlProperty(timePicker, uiTimePicker => uiTimePicker.PreferredDatePickerStyle);
Assert.That(actual, Is.EqualTo(expected));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
<Compile Include="BackgroundColorTests.cs" />
<Compile Include="ColorComparison.cs" />
<Compile Include="CornerRadiusTests.cs" />
<Compile Include="DatePickerTests.cs" />
<Compile Include="EmbeddingTests.cs" />
<Compile Include="FlowDirectionTests.cs" />
<Compile Include="FrameTests.cs" />
Expand All @@ -66,6 +67,7 @@
<Compile Include="ScaleTests.cs" />
<Compile Include="TextTests.cs" />
<Compile Include="BackgroundTests.cs" />
<Compile Include="TimePickerTests.cs" />
<Compile Include="TransformationTests.cs" />
</ItemGroup>
<ItemGroup>
Expand Down
4 changes: 2 additions & 2 deletions Xamarin.Forms.Platform.iOS/Renderers/DatePickerRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ public abstract class DatePickerRendererBase<TControl> : ViewRenderer<DatePicker

IElementController ElementController => Element as IElementController;

internal UIDatePicker Picker => _picker;

abstract protected override TControl CreateNativeControl();

Expand All @@ -73,12 +74,11 @@ protected override void OnElementChanged(ElementChangedEventArgs<DatePicker> e)

_picker = new UIDatePicker { Mode = UIDatePickerMode.Date, TimeZone = new NSTimeZone("UTC") };

#if __XCODE11__
if (Forms.IsiOS14OrNewer)
{
_picker.PreferredDatePickerStyle = UIKit.UIDatePickerStyle.Wheels;
}
#endif

_picker.ValueChanged += HandleValueChanged;

var width = UIScreen.MainScreen.Bounds.Width;
Expand Down
6 changes: 4 additions & 2 deletions Xamarin.Forms.Platform.iOS/Renderers/TimePickerRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ public abstract class TimePickerRendererBase<TControl> : ViewRenderer<TimePicker
bool _disposed;
bool _useLegacyColorManagement;

internal UIDatePicker Picker => _picker;

IElementController ElementController => Element as IElementController;

[Internals.Preserve(Conditional = true)]
Expand Down Expand Up @@ -83,12 +85,12 @@ protected override void OnElementChanged(ElementChangedEventArgs<TimePicker> e)
entry.EditingDidEnd += OnEnded;

_picker = new UIDatePicker { Mode = UIDatePickerMode.Time, TimeZone = new NSTimeZone("UTC") };
#if __XCODE11__

if (Forms.IsiOS14OrNewer)
{
_picker.PreferredDatePickerStyle = UIKit.UIDatePickerStyle.Wheels;
}
#endif

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);
Expand Down