UIDatePicker หยุดทำงาน Xamarin IOS14
เนื่องจากฉันได้อัปเดต Xcode 12 และ VS (2019 8.7.8 build 4) บนเครื่อง Mac ของฉันและอัปเดต Xamarin เป็นเวอร์ชันล่าสุด (Xamarin.iOS 14.0.0.0) ฉันพบว่าฉันไม่สามารถใช้ UIDatePicker ได้
เลือกวันที่
ดูเอกสาร https://developer.apple.com/documentation/uikit/uidatepicker ฉันจำเป็นต้องตั้งค่า Style และอาจเป็นที่ต้องการของ DatePickerStyle แต่นี่คือคุณสมบัติที่ฉันสามารถตั้งค่าได้ในโค้ด (Xamarin)
มีใครพบวิธีที่จะผ่านสิ่งนี้เพื่อเปิดใช้งานวันที่ที่จะเลือก?
คำตอบ
จะใช้งานได้เมื่อเราตั้งค่าpreferredDatePickerStyleและsizeToFitรหัสตัวอย่างจะได้รับด้านล่าง
_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
ฉันได้แก้ไขแล้วด้วยสิ่งนี้:
_datePicker.SetValueForKey(new NSNumber(1), new NSString("preferredDatePickerStyle"));
ตอนนี้แสดงตัวเลือกที่ถูกต้อง
ตัวเลือกวันที่
ฉันยังพบปัญหาที่น่าสนใจนี้เมื่อเร็ว ๆ นี้ เมื่อเราใช้ Xcode 12 ในการทำแพ็กเกจทุกอย่างก็เป็นปกติ แต่เมื่อเปลี่ยนเป็น Xcode 12 ขึ้นไปสำหรับการเลือกและแสดงวันบรรจุภัณฑ์มันจะดูผิดปกติ
เนื่องจาก iOS 13.4 UIDatePicker มีคุณสมบัติใหม่
- @property (nonatomic, readwrite, กำหนด) UIDatePickerStyle recommendedDatePickerStyle API_AVAILABLE (ios (13.4)) API_UNAVAILABLE (tvos, watchos);
หากคุณต้องการคงรูปแบบเดิมคุณสามารถเพิ่มรหัสนี้ได้
_datePick = [[UIDatePicker alloc] init];
if (@available(iOS 13.4, *)) {
_datePick.preferredDatePickerStyle = UIDatePickerStyleWheels;
}
ฉันพื้นวางกันทุกรายละเอียดของคำตอบอื่น ๆ ลงไปในการดำเนินงานที่สอดคล้องกันในpublic class CustomDatePickerRenderer : DatePickerRendererสำหรับแบบฟอร์ม Xamarin ใน iOS (ละเว้นการดำเนินงานของฉันCreateNativeControl, OnElementPropertyChangedและวิธีการที่กำหนดเองสำหรับความกะทัดรัด):
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();
}