UIDatePicker parou de funcionar Xamarin IOS14
Desde que atualizei para o Xcode 12 e VS (2019 8.7.8 build 4) no meu mac e atualizei o Xamarin para a versão mais recente (Xamarin.iOS 14.0.0.0), não consigo usar o UIDatePicker.
DatePicker
Olhando a documentação, https://developer.apple.com/documentation/uikit/uidatepicker Preciso definir Style e talvez preferredDatePickerStyle, mas também não são propriedades que posso definir no código (Xamarin).
Alguém encontrou uma maneira de superar isso para permitir que a data seja selecionada?
Respostas
Funcionará assim que definirmos o preferredDatePickerStylee sizeToFit, o código de exemplo é fornecido abaixo.
_datePicker = new UIDatePicker(new CGRect(0, 30, 0, 0));
_datePicker.AutoresizingMask = UIViewAutoresizing.FlexibleRightMargin;
_datePicker.Frame = new CGRect(_datePicker.Frame.Location, new CGSize(300, _datePicker.Frame.Size.Height));
_datePicker.Mode = _datePickerMode;
_datePicker.Date = (NSDate)_defaultDate;
_datePicker.PreferredDatePickerStyle = UIDatePickerStyle.Wheels; //Add this in ios14
_datePicker.SizeToFit(); //Add this in ios14
Eu resolvi com isso:
_datePicker.SetValueForKey(new NSNumber(1), new NSString("preferredDatePickerStyle"));
Agora está mostrando o seletor correto
Seletor de Data
Eu também encontrei este problema interessante recentemente. Quando usamos o Xcode 12 para empacotá-lo, tudo estava normal, mas ao mudar para o Xcode 12 e superior para seleção de data de empacotamento e exibição, parecia anormal.
Porque iOS 13.4 UIDatePicker tem novos recursos
- @property (nonatomic, readwrite, assign) UIDatePickerStyle preferredDatePickerStyle API_AVAILABLE (ios (13.4)) API_UNAVAILABLE (tvos, watchos);
Se você quiser manter o estilo original, pode adicionar este código
_datePick = [[UIDatePicker alloc] init];
if (@available(iOS 13.4, *)) {
_datePick.preferredDatePickerStyle = UIDatePickerStyleWheels;
}
Estou basicamente colocar juntos todos os detalhes das outras respostas para a implementação correspondente public class CustomDatePickerRenderer : DatePickerRendererpara Xamarin formulários no iOS (omitido minha implementação de CreateNativeControl, OnElementPropertyChangede métodos personalizados para brevidade):
protected override void OnElementChanged(ElementChangedEventArgs<DatePicker> e)
{
const int iosVersionMajorForDatePickerStyleFeature = 13;
const int iosVersionMinorForDatePickerStyleFeature = 4;
base.OnElementChanged(e);
if (e.OldElement != null || Element == null)
{
return;
}
//Switch back to the Wheels style for the datePicker (in iOS 14 the default of Automatic uses the Compact style)
if (UIDevice.CurrentDevice.CheckSystemVersion(iosVersionMajorForDatePickerStyleFeature, iosVersionMinorForDatePickerStyleFeature)
&& Control?.InputView is UIDatePicker datePicker && datePicker.PreferredDatePickerStyle != UIDatePickerStyle.Wheels)
{
datePicker.PreferredDatePickerStyle = UIDatePickerStyle.Wheels;
datePicker.SizeToFit();
}
//Do whatever other customization is desired
//UpdateBorderColor();
//UpdateBorderWidth();
//UpdateCornerRadius();
//UpdatePadding();
}