仅在 iPhone XS 和 11plus 上发布渲染 UIDatePicker
Issue rendering UIDatePicker on iPhone XS and 11plus only
我需要在 Xamarin.Forms 项目中组合日期和时间选择器,因此我使用了自定义视图和渲染器,它在我的 iPhone 8 Plus 测试设备上运行良好。不幸的是,在 iPhone XS 或 11 Pro(物理设备,均在 13.3 上)上,选择器无法正确呈现 - 所有日期都显示为灰色,时间完全不可见但仍然存在(我能感觉到 'clicks' 在它所在的区域滑动 up/down 时)。不出所料,这两种设备的模拟器都能正确呈现。完整示例项目以及两个设备的屏幕截图 on GitHub。这是渲染器的相关代码,以防万一:
protected override void OnElementChanged(ElementChangedEventArgs<MyDatePicker> e)
{
base.OnElementChanged(e);
if (e.OldElement != null)
{
_datePicker.ValueChanged -= DatePickerOnValueChanged;
}
if (e.NewElement != null)
{
if (Control == null)
{
_datePicker = new UIDatePicker(new CGRect(
e.NewElement.Bounds.X,
e.NewElement.Bounds.Y,
e.NewElement.Bounds.Width,
e.NewElement.Bounds.Height
));
_datePicker.Mode = UIDatePickerMode.DateAndTime;
_datePicker.Date = (NSDate) Element.Date;
_datePicker.MaximumDate = (NSDate) Element.Date.AddDays(1);
_datePicker.MinimumDate = (NSDate) Element.Date.Subtract(TimeSpan.FromDays(5));
_datePicker.MinuteInterval = 1;
SetNativeControl(_datePicker);
}
_datePicker.ValueChanged += DatePickerOnValueChanged;
}
}
Xamarin Forums 上知识渊博的 ColeX 解决了这个问题。 ColeX 确实应该为此加分,但我将答案发布在这里,这样如果其他人在 SO 上搜索此问题,他们就会看到解决方案。
根本原因是 iOS 上的深色模式,当时应用未设置为在 light/dark 模式下以不同方式呈现自身。结果,OS 认为它在深色背景上呈现日期选择器,但事实并非如此,因此它实际上是不可见的。提到了 few solutions,但对我有用的是将以下内容添加到 iOS 项目中的 Info.plist:
<key>UIUserInterfaceStyle</key>
<string>Light</string>
我需要在 Xamarin.Forms 项目中组合日期和时间选择器,因此我使用了自定义视图和渲染器,它在我的 iPhone 8 Plus 测试设备上运行良好。不幸的是,在 iPhone XS 或 11 Pro(物理设备,均在 13.3 上)上,选择器无法正确呈现 - 所有日期都显示为灰色,时间完全不可见但仍然存在(我能感觉到 'clicks' 在它所在的区域滑动 up/down 时)。不出所料,这两种设备的模拟器都能正确呈现。完整示例项目以及两个设备的屏幕截图 on GitHub。这是渲染器的相关代码,以防万一:
protected override void OnElementChanged(ElementChangedEventArgs<MyDatePicker> e)
{
base.OnElementChanged(e);
if (e.OldElement != null)
{
_datePicker.ValueChanged -= DatePickerOnValueChanged;
}
if (e.NewElement != null)
{
if (Control == null)
{
_datePicker = new UIDatePicker(new CGRect(
e.NewElement.Bounds.X,
e.NewElement.Bounds.Y,
e.NewElement.Bounds.Width,
e.NewElement.Bounds.Height
));
_datePicker.Mode = UIDatePickerMode.DateAndTime;
_datePicker.Date = (NSDate) Element.Date;
_datePicker.MaximumDate = (NSDate) Element.Date.AddDays(1);
_datePicker.MinimumDate = (NSDate) Element.Date.Subtract(TimeSpan.FromDays(5));
_datePicker.MinuteInterval = 1;
SetNativeControl(_datePicker);
}
_datePicker.ValueChanged += DatePickerOnValueChanged;
}
}
Xamarin Forums 上知识渊博的 ColeX 解决了这个问题。 ColeX 确实应该为此加分,但我将答案发布在这里,这样如果其他人在 SO 上搜索此问题,他们就会看到解决方案。
根本原因是 iOS 上的深色模式,当时应用未设置为在 light/dark 模式下以不同方式呈现自身。结果,OS 认为它在深色背景上呈现日期选择器,但事实并非如此,因此它实际上是不可见的。提到了 few solutions,但对我有用的是将以下内容添加到 iOS 项目中的 Info.plist:
<key>UIUserInterfaceStyle</key>
<string>Light</string>