-
-
Notifications
You must be signed in to change notification settings - Fork 456
Expand file tree
/
Copy pathRNDateTimePickerShadowView.m
More file actions
88 lines (72 loc) · 2.93 KB
/
RNDateTimePickerShadowView.m
File metadata and controls
88 lines (72 loc) · 2.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#import "RNDateTimePickerShadowView.h"
@implementation RNDateTimePickerShadowView
- (instancetype)init
{
if (self = [super init]) {
YGNodeSetMeasureFunc(self.yogaNode, RNDateTimePickerShadowViewMeasure);
}
return self;
}
- (void)setDate:(NSDate *)date {
_date = date;
YGNodeMarkDirty(self.yogaNode);
}
- (void)setLocale:(NSLocale *)locale {
_locale = locale;
YGNodeMarkDirty(self.yogaNode);
}
- (void)setMode:(UIDatePickerMode)mode {
_mode = mode;
YGNodeMarkDirty(self.yogaNode);
}
- (void)setDisplayIOS:(UIDatePickerStyle)displayIOS {
_displayIOS = displayIOS;
YGNodeMarkDirty(self.yogaNode);
}
- (void)setTimeZoneOffsetInMinutes:(NSInteger)timeZoneOffsetInMinutes {
_timeZoneOffsetInMinutes = timeZoneOffsetInMinutes;
YGNodeMarkDirty(self.yogaNode);
}
- (void)setTimeZoneName:(NSString *)timeZoneName {
_timeZoneName = timeZoneName;
YGNodeMarkDirty(self.yogaNode);
}
static YGSize RNDateTimePickerShadowViewMeasure(YGNodeRef node, float width, YGMeasureMode widthMode, float height, YGMeasureMode heightMode)
{
RNDateTimePickerShadowView *shadowPickerView = (__bridge RNDateTimePickerShadowView *)YGNodeGetContext(node);
__block CGSize size;
dispatch_sync(dispatch_get_main_queue(), ^{
if (@available(iOS 14.0, *)) {
// if this is not reset to the default before setting style it can result in a crash
// use case: picker was first shown with mode that is not UIDatePickerModeCountDownTimer then
// displayed again in different UI with mode UIDatePickerModeCountDownTimer
[shadowPickerView.picker setDatePickerMode:UIDatePickerModeDateAndTime];
[shadowPickerView.picker setPreferredDatePickerStyle:shadowPickerView.displayIOS];
}
[shadowPickerView.picker setDate:shadowPickerView.date];
[shadowPickerView.picker setDatePickerMode:shadowPickerView.mode];
[shadowPickerView.picker setLocale:shadowPickerView.locale];
[shadowPickerView.picker setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:shadowPickerView.timeZoneOffsetInMinutes * 60]];
if (shadowPickerView.timeZoneName) {
NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:shadowPickerView.timeZoneName];
if (timeZone != nil) {
[shadowPickerView.picker setTimeZone:timeZone];
} else {
RCTLogWarn(@"'%@' does not exist in NSTimeZone.knownTimeZoneNames. Falling back to localTimeZone=%@", shadowPickerView.timeZoneName, NSTimeZone.localTimeZone.name);
[shadowPickerView.picker setTimeZone:NSTimeZone.localTimeZone];
}
} else {
[shadowPickerView.picker setTimeZone:NSTimeZone.localTimeZone];
}
if (@available(iOS 14.0, *)) {
[shadowPickerView.picker setPreferredDatePickerStyle:shadowPickerView.displayIOS];
}
size = [shadowPickerView.picker sizeThatFits:UILayoutFittingCompressedSize];
size.width += 10;
});
return (YGSize){
RCTYogaFloatFromCoreGraphicsFloat(size.width),
RCTYogaFloatFromCoreGraphicsFloat(size.height)
};
}
@end