From 63a1c49040d6fe02891585c89a4e51fc66b3f25c Mon Sep 17 00:00:00 2001 From: gaodeng Date: Wed, 11 Sep 2019 05:10:06 -0700 Subject: [PATCH 1/2] iOS13 status bar has now 3 styles (#26294) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: iOS13 status bar has now 3 styles UIStatusBarStyleDefault, UIStatusBarStyleLightContent, UIStatusBarStyleDarkContent UIStatusBarStyleDefault now acts as an automatic style which will set it’s value dynamically based on the the userinterfacestyle(One of the traits) of the viewcontroller that controls the status bar appearance. [iOS] [Fixed] - iOS13 new status bar style UIStatusBarStyleDarkContent Pull Request resolved: https://github.com/facebook/react-native/pull/26294 Differential Revision: D17314054 Pulled By: cpojer fbshipit-source-id: ea109e729bb551dff314bc00a056860a8febb0e9 --- React/Modules/RCTStatusBarManager.m | 106 ++++++++++++++++++---------- 1 file changed, 70 insertions(+), 36 deletions(-) diff --git a/React/Modules/RCTStatusBarManager.m b/React/Modules/RCTStatusBarManager.m index 5136b36907ccdd..f0134043f46efc 100644 --- a/React/Modules/RCTStatusBarManager.m +++ b/React/Modules/RCTStatusBarManager.m @@ -14,17 +14,44 @@ #if !TARGET_OS_TV @implementation RCTConvert (UIStatusBar) -RCT_ENUM_CONVERTER(UIStatusBarStyle, (@{ - @"default": @(UIStatusBarStyleDefault), - @"light-content": @(UIStatusBarStyleLightContent), - @"dark-content": @(UIStatusBarStyleDefault), -}), UIStatusBarStyleDefault, integerValue); - -RCT_ENUM_CONVERTER(UIStatusBarAnimation, (@{ - @"none": @(UIStatusBarAnimationNone), - @"fade": @(UIStatusBarAnimationFade), - @"slide": @(UIStatusBarAnimationSlide), -}), UIStatusBarAnimationNone, integerValue); ++ (UIStatusBarStyle)UIStatusBarStyle:(id)json RCT_DYNAMIC +{ + static NSDictionary *mapping; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + if (@available(iOS 13.0, *)) { + mapping = @{ + @"default" : @(UIStatusBarStyleDefault), + @"light-content" : @(UIStatusBarStyleLightContent), +#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \ + __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0 + @"dark-content" : @(UIStatusBarStyleDarkContent) +#else + @"dark-content": @(UIStatusBarStyleDefault) +#endif + }; + + } else { + mapping = @{ + @"default" : @(UIStatusBarStyleDefault), + @"light-content" : @(UIStatusBarStyleLightContent), + @"dark-content" : @(UIStatusBarStyleDefault) + }; + } + }); + return _RCT_CAST( + type, [RCTConvertEnumValue("UIStatusBarStyle", mapping, @(UIStatusBarStyleDefault), json) integerValue]); +} + +RCT_ENUM_CONVERTER( + UIStatusBarAnimation, + (@{ + @"none" : @(UIStatusBarAnimationNone), + @"fade" : @(UIStatusBarAnimationFade), + @"slide" : @(UIStatusBarAnimationSlide), + }), + UIStatusBarAnimationNone, + integerValue); @end #endif @@ -36,8 +63,9 @@ static BOOL RCTViewControllerBasedStatusBarAppearance() static BOOL value; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ - value = [[[NSBundle mainBundle] objectForInfoDictionaryKey: - @"UIViewControllerBasedStatusBarAppearance"] ?: @YES boolValue]; + value = + [[[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIViewControllerBasedStatusBarAppearance"] + ?: @YES boolValue]; }); return value; @@ -47,8 +75,7 @@ static BOOL RCTViewControllerBasedStatusBarAppearance() - (NSArray *)supportedEvents { - return @[@"statusBarFrameDidChange", - @"statusBarFrameWillChange"]; + return @[ @"statusBarFrameDidChange", @"statusBarFrameWillChange" ]; } #if !TARGET_OS_TV @@ -56,8 +83,14 @@ static BOOL RCTViewControllerBasedStatusBarAppearance() - (void)startObserving { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc addObserver:self selector:@selector(applicationDidChangeStatusBarFrame:) name:UIApplicationDidChangeStatusBarFrameNotification object:nil]; - [nc addObserver:self selector:@selector(applicationWillChangeStatusBarFrame:) name:UIApplicationWillChangeStatusBarFrameNotification object:nil]; + [nc addObserver:self + selector:@selector(applicationDidChangeStatusBarFrame:) + name:UIApplicationDidChangeStatusBarFrameNotification + object:nil]; + [nc addObserver:self + selector:@selector(applicationWillChangeStatusBarFrame:) + name:UIApplicationWillChangeStatusBarFrameNotification + object:nil]; } - (void)stopObserving @@ -74,11 +107,11 @@ - (void)emitEvent:(NSString *)eventName forNotification:(NSNotification *)notifi { CGRect frame = [notification.userInfo[UIApplicationStatusBarFrameUserInfoKey] CGRectValue]; NSDictionary *event = @{ - @"frame": @{ - @"x": @(frame.origin.x), - @"y": @(frame.origin.y), - @"width": @(frame.size.width), - @"height": @(frame.size.height), + @"frame" : @{ + @"x" : @(frame.origin.x), + @"y" : @(frame.origin.y), + @"width" : @(frame.size.width), + @"height" : @(frame.size.height), }, }; [self sendEventWithName:eventName body:event]; @@ -94,42 +127,43 @@ - (void)applicationWillChangeStatusBarFrame:(NSNotification *)notification [self emitEvent:@"statusBarFrameWillChange" forNotification:notification]; } -RCT_EXPORT_METHOD(getHeight:(RCTResponseSenderBlock)callback) +RCT_EXPORT_METHOD(getHeight : (RCTResponseSenderBlock)callback) { - callback(@[@{ - @"height": @(RCTSharedApplication().statusBarFrame.size.height), - }]); + callback(@[ @{ + @"height" : @(RCTSharedApplication().statusBarFrame.size.height), + } ]); } -RCT_EXPORT_METHOD(setStyle:(UIStatusBarStyle)statusBarStyle - animated:(BOOL)animated) +RCT_EXPORT_METHOD(setStyle : (UIStatusBarStyle)statusBarStyle animated : (BOOL)animated) { if (RCTViewControllerBasedStatusBarAppearance()) { RCTLogError(@"RCTStatusBarManager module requires that the \ UIViewControllerBasedStatusBarAppearance key in the Info.plist is set to NO"); } else { - [RCTSharedApplication() setStatusBarStyle:statusBarStyle - animated:animated]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + [RCTSharedApplication() setStatusBarStyle:statusBarStyle animated:animated]; } } -RCT_EXPORT_METHOD(setHidden:(BOOL)hidden - withAnimation:(UIStatusBarAnimation)animation) +RCT_EXPORT_METHOD(setHidden : (BOOL)hidden withAnimation : (UIStatusBarAnimation)animation) { if (RCTViewControllerBasedStatusBarAppearance()) { RCTLogError(@"RCTStatusBarManager module requires that the \ UIViewControllerBasedStatusBarAppearance key in the Info.plist is set to NO"); } else { - [RCTSharedApplication() setStatusBarHidden:hidden - withAnimation:animation]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + [RCTSharedApplication() setStatusBarHidden:hidden withAnimation:animation]; +#pragma clang diagnostic pop } } -RCT_EXPORT_METHOD(setNetworkActivityIndicatorVisible:(BOOL)visible) +RCT_EXPORT_METHOD(setNetworkActivityIndicatorVisible : (BOOL)visible) { RCTSharedApplication().networkActivityIndicatorVisible = visible; } -#endif //TARGET_OS_TV +#endif // TARGET_OS_TV @end From f493a8bb0c2eb29e136d9ea18a9d19e9b3c417ff Mon Sep 17 00:00:00 2001 From: Jonathan Wu Date: Mon, 18 Nov 2019 18:19:49 -0800 Subject: [PATCH 2/2] forgot a pop? --- React/Modules/RCTStatusBarManager.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/React/Modules/RCTStatusBarManager.m b/React/Modules/RCTStatusBarManager.m index f0134043f46efc..e8b9c753c7aa79 100644 --- a/React/Modules/RCTStatusBarManager.m +++ b/React/Modules/RCTStatusBarManager.m @@ -144,6 +144,7 @@ - (void)applicationWillChangeStatusBarFrame:(NSNotification *)notification #pragma clang diagnostic ignored "-Wdeprecated-declarations" [RCTSharedApplication() setStatusBarStyle:statusBarStyle animated:animated]; } +#pragma clang diagnostic pop } RCT_EXPORT_METHOD(setHidden : (BOOL)hidden withAnimation : (UIStatusBarAnimation)animation) @@ -166,4 +167,4 @@ - (void)applicationWillChangeStatusBarFrame:(NSNotification *)notification #endif // TARGET_OS_TV -@end +@end \ No newline at end of file