diff --git a/Examples/Movies/Info.plist b/Examples/Movies/Info.plist index 1c298405ac3722..3c7e8c72e4aea1 100644 --- a/Examples/Movies/Info.plist +++ b/Examples/Movies/Info.plist @@ -28,6 +28,8 @@ armv7 + UIViewControllerBasedStatusBarAppearance + UISupportedInterfaceOrientations UIInterfaceOrientationPortrait diff --git a/Examples/TicTacToe/Info.plist b/Examples/TicTacToe/Info.plist index 1c298405ac3722..3c7e8c72e4aea1 100644 --- a/Examples/TicTacToe/Info.plist +++ b/Examples/TicTacToe/Info.plist @@ -28,6 +28,8 @@ armv7 + UIViewControllerBasedStatusBarAppearance + UISupportedInterfaceOrientations UIInterfaceOrientationPortrait diff --git a/Examples/UIExplorer/Info.plist b/Examples/UIExplorer/Info.plist index 1c298405ac3722..3c7e8c72e4aea1 100644 --- a/Examples/UIExplorer/Info.plist +++ b/Examples/UIExplorer/Info.plist @@ -28,6 +28,8 @@ armv7 + UIViewControllerBasedStatusBarAppearance + UISupportedInterfaceOrientations UIInterfaceOrientationPortrait diff --git a/Examples/UIExplorer/StatusBarIOSExample.js b/Examples/UIExplorer/StatusBarIOSExample.js new file mode 100644 index 00000000000000..0c0ff567fac0a5 --- /dev/null +++ b/Examples/UIExplorer/StatusBarIOSExample.js @@ -0,0 +1,86 @@ +/** + * @providesModule StatusBarIOSExample + */ +'use strict'; + +var React = require('react-native'); +var { + StyleSheet, + View, + Text, + TouchableHighlight, + StatusBarIOS, +} = React; + +exports.framework = 'React'; +exports.title = 'StatusBarIOS'; +exports.description = 'Module for controlling iOS status bar'; +exports.examples = [{ + title: 'Status Bar Style', + render() { + return ( + + {Object.keys(StatusBarIOS.style).map((key) => + StatusBarIOS.setStyle(StatusBarIOS.style[key])}> + + setStyle(StatusBarIOS.style.{key}) + + + )} + + ); + }, +}, { + title: 'Status Bar Style Animated', + render() { + return ( + + {Object.keys(StatusBarIOS.style).map((key) => + StatusBarIOS.setStyle(StatusBarIOS.style[key], true)}> + + setStyle(StatusBarIOS.style.{key}, true) + + + )} + + ); + }, +}, { + title: 'Status Bar Hidden', + render() { + return ( + + {Object.keys(StatusBarIOS.animation).map((key) => + + StatusBarIOS.setHidden(true, StatusBarIOS.animation[key])}> + + setHidden(true, StatusBarIOS.animation.{key}) + + + StatusBarIOS.setHidden(false, StatusBarIOS.animation[key])}> + + setHidden(false, StatusBarIOS.animation.{key}) + + + + )} + + ); + }, +}]; + +var styles = StyleSheet.create({ + wrapper: { + borderRadius: 5, + marginBottom: 5, + }, + button: { + backgroundColor: '#eeeeee', + padding: 10, + }, +}); + diff --git a/Examples/UIExplorer/UIExplorerList.js b/Examples/UIExplorer/UIExplorerList.js index 207ad2d66b8d0b..9effbf8e46da14 100644 --- a/Examples/UIExplorer/UIExplorerList.js +++ b/Examples/UIExplorer/UIExplorerList.js @@ -25,6 +25,7 @@ var EXAMPLES = [ require('./ImageExample'), require('./ListViewSimpleExample'), require('./NavigatorIOSExample'), + require('./StatusBarIOSExample'), require('./PointerEventsExample'), require('./TouchableExample'), require('./SpinnerExample'), diff --git a/Libraries/Components/StatusBar/StatusBarIOS.ios.js b/Libraries/Components/StatusBar/StatusBarIOS.ios.js new file mode 100644 index 00000000000000..6495d5afbf3dd0 --- /dev/null +++ b/Libraries/Components/StatusBar/StatusBarIOS.ios.js @@ -0,0 +1,31 @@ +/** + * @providesModule StatusBarIOS + */ +'use strict'; + +var { RCTStatusBarManager } = require('NativeModules'); + +var StatusBarIOS = { + style: { + default: 0, + lightContent: 1, + }, + + animation: { + none: 0, + fade: 1, + slide: 2, + }, + + setStyle(style, animated) { + animated = animated || false; + RCTStatusBarManager.setStatusBarStyle(style, animated); + }, + + setHidden(hidden, animation) { + animation = animation || StatusBarIOS.animation.none; + RCTStatusBarManager.setStatusBarHidden(hidden, animation); + }, +}; + +module.exports = StatusBarIOS; diff --git a/Libraries/react-native/react-native.js b/Libraries/react-native/react-native.js index 12a82fefaee4b5..b483534e1825b9 100644 --- a/Libraries/react-native/react-native.js +++ b/Libraries/react-native/react-native.js @@ -11,6 +11,7 @@ var Image = require('Image'); var ListView = require('ListView'); var ListViewDataSource = require('ListViewDataSource'); var NavigatorIOS = require('NavigatorIOS'); +var StatusBarIOS = require('StatusBarIOS'); var PixelRatio = require('PixelRatio'); var React = require('React'); var ScrollView = require('ScrollView'); @@ -34,6 +35,7 @@ var ReactNative = { ListView, ListViewDataSource, NavigatorIOS, + StatusBarIOS, PixelRatio, ScrollView, SpinnerIOS, diff --git a/ReactKit/Modules/RCTStatusBarManager.h b/ReactKit/Modules/RCTStatusBarManager.h new file mode 100644 index 00000000000000..97fd45d4271442 --- /dev/null +++ b/ReactKit/Modules/RCTStatusBarManager.h @@ -0,0 +1,7 @@ +#import + +#import "RCTExport.h" + +@interface RCTStatusBarManager : NSObject + +@end diff --git a/ReactKit/Modules/RCTStatusBarManager.m b/ReactKit/Modules/RCTStatusBarManager.m new file mode 100644 index 00000000000000..168be8d7ee766d --- /dev/null +++ b/ReactKit/Modules/RCTStatusBarManager.m @@ -0,0 +1,25 @@ +#import "RCTStatusBarManager.h" + +@implementation RCTStatusBarManager + +- (void)setStatusBarStyle:(NSNumber *)statusBarStyle animated:(NSNumber *)animated { + RCT_EXPORT(); + + dispatch_async(dispatch_get_main_queue(), ^{ + [[UIApplication sharedApplication] + setStatusBarStyle:[statusBarStyle intValue] + animated:[animated boolValue]]; + }); +} + +- (void)setStatusBarHidden:(NSNumber *)hidden withAnimation:(NSNumber *)animation { + RCT_EXPORT(); + + dispatch_async(dispatch_get_main_queue(), ^{ + [[UIApplication sharedApplication] + setStatusBarHidden:[hidden boolValue] + withAnimation:[animation intValue]]; + }); +} + +@end diff --git a/ReactKit/ReactKit.xcodeproj/project.pbxproj b/ReactKit/ReactKit.xcodeproj/project.pbxproj index 286dc278abd64e..a2579294a4989e 100644 --- a/ReactKit/ReactKit.xcodeproj/project.pbxproj +++ b/ReactKit/ReactKit.xcodeproj/project.pbxproj @@ -42,6 +42,7 @@ 13E067571A70F44B002CDEE1 /* RCTView.m in Sources */ = {isa = PBXBuildFile; fileRef = 13E067501A70F44B002CDEE1 /* RCTView.m */; }; 13E067581A70F44B002CDEE1 /* RCTViewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 13E067521A70F44B002CDEE1 /* RCTViewManager.m */; }; 13E067591A70F44B002CDEE1 /* UIView+ReactKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 13E067541A70F44B002CDEE1 /* UIView+ReactKit.m */; }; + 396767821A7C247E003BFF0E /* RCTStatusBarManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 396767811A7C247E003BFF0E /* RCTStatusBarManager.m */; }; 830A229E1A66C68A008503DA /* RCTRootView.m in Sources */ = {isa = PBXBuildFile; fileRef = 830A229D1A66C68A008503DA /* RCTRootView.m */; }; 832348161A77A5AA00B55238 /* Layout.c in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FC71A68125100A75B9A /* Layout.c */; }; 83CBBA511A601E3B00E9B192 /* RCTAssert.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CBBA4B1A601E3B00E9B192 /* RCTAssert.m */; }; @@ -142,6 +143,8 @@ 13E067521A70F44B002CDEE1 /* RCTViewManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTViewManager.m; sourceTree = ""; }; 13E067531A70F44B002CDEE1 /* UIView+ReactKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+ReactKit.h"; sourceTree = ""; }; 13E067541A70F44B002CDEE1 /* UIView+ReactKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+ReactKit.m"; sourceTree = ""; }; + 396767801A7C247E003BFF0E /* RCTStatusBarManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTStatusBarManager.h; sourceTree = ""; }; + 396767811A7C247E003BFF0E /* RCTStatusBarManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTStatusBarManager.m; sourceTree = ""; }; 830213F31A654E0800B993E6 /* RCTExport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTExport.h; sourceTree = ""; }; 830213F41A65574D00B993E6 /* RCTExport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTExport.m; sourceTree = ""; }; 830A229C1A66C68A008503DA /* RCTRootView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTRootView.h; sourceTree = ""; }; @@ -225,6 +228,8 @@ 13B07FEE1A69327A00A75B9A /* RCTTiming.m */, 13E067481A70F434002CDEE1 /* RCTUIManager.h */, 13E067491A70F434002CDEE1 /* RCTUIManager.m */, + 396767801A7C247E003BFF0E /* RCTStatusBarManager.h */, + 396767811A7C247E003BFF0E /* RCTStatusBarManager.m */, ); path = Modules; sourceTree = ""; @@ -474,6 +479,7 @@ 83CBBA871A60202500E9B192 /* RCTJavaScriptAppEngine.m in Sources */, 134FCB3E1A6E7F0800051CC8 /* RCTWebViewExecutor.m in Sources */, 83EEC2EE1A604AB200C39218 /* RCTModuleMethod.m in Sources */, + 396767821A7C247E003BFF0E /* RCTStatusBarManager.m in Sources */, 13B0801C1A69489C00A75B9A /* RCTNavItem.m in Sources */, 137029331A69659C00575408 /* RCTExport.m in Sources */, 83CBBA691A601EF300E9B192 /* RCTJavaScriptEventDispatcher.m in Sources */,