LaunchScreenã«ã€ããŠè¯ãç¿æ £ããããã©ããçåã«æã£ãŠããŸãã ç§ããããæ±ããŠããçç±ã¯ãLaunchScreenãè¿œå ãããšãreact-nativeãèµ·åããŠã¢ããªãããŒãããåã«çœããã©ãã·ã¥ã衚瀺ãããããã§ãã ãããé²ãæ¹æ³ã¯ãããŸããïŒ
@ alinz-ããã¯æ¬¡ã®ãªãªãŒã¹ã§ä¿®æ£ãããŸãïŒ //github.com/tadeuzagallo/react-native/commit/8d992262ed2dcf0d46e8d22e605764902c33012f
@alinzã¯https://www.dropbox.com/s/xq522ywqsd16vqe/example.mov?dl=0ã®ããã«èŠããŸãã
@liubkoã¯ããããã¯ãŸãã«ç§ãåãé€ããããã®ã§ãã ãŸã ããããé©çšããŠããŸããããä»å€é©çšããŸãã
@brentvatne ïŒãã®ãããããã®åé¡ãã©ã®ããã«ä¿®æ£ãããããããŸããïŒç§ãç²ç®/æãã§ããå Žåã¯èš±ããŠãã ãã:-)ãåé¡ã¯ãã¢ããªãèµ·åããŠããReactããŸã æ©èœããŠããéã«æéããããããšã§ããçæ³çã«ã¯ãLaunchScreenã¯ããå®å šã«ãã€ãã£ããªãã¢ããªã®å Žåãšåæ§ã«ãReactãçµäºããŠå®å šã«ã¬ã³ããªã³ã°ããããŸã§è¡šç€ºãããŸãã
@ oblador-ãããããã«ããããã¡ãã€ããã®ç¬éã«èµ·åç»é¢ãšåãèæ¯è²ã䜿çšããããšã§ãããã¹ã ãŒãºã«ç§»è¡ã§ããŸãã
@ vjeux -FBã¢ããªã§ãã®åé¡ãã©ã®ããã«@nicklockwood
ãã®åé¡ã«ã¯ïŒå¥ã®ïŒä¿®æ£ããããŸãã RCTRootView
ã®æ°ããloadingView
ããããã£ã䜿çšããèµ·åç»åã衚瀺ãããã«ã¹ã¯ãªãŒã³UIImageView
ãŸãã ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
UIImageView *launchView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"MyLaunchImage"];
rootView.loadingView = launchView;
èµ·åç»åãèªåçã«æ€åºããŠå®å šã«èªååããæ¹æ³ãè©ŠããŠããŸãããããŸã æºåãã§ããŠããŸããã èå³ãããå Žåã¯ã次ã®ããã«ãªããŸãã
// TODO: support landscape orientation
// Get launch image
NSString *launchImageName = nil;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
CGFloat height = MAX(RCTScreenSize().width, RCTScreenSize().height);
if (height == 480) launchImageName = @"[email protected]"; // iPhone 4/4s
else if (height == 568) launchImageName = @"[email protected]"; // iPhone 5/5s
else if (height == 667) launchImageName = @"[email protected]"; // iPhone 6
else if (height == 736) launchImageName = @"[email protected]"; // iPhone 6+
} else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
CGFloat scale = RCTScreenScale();
if (scale == 1) launchImageName = @"LaunchImage-700-Portrait~ipad.png"; // iPad
else if (scale == 2) launchImageName = @"LaunchImage-700-Portrait@2x~ipad.png"; // Retina iPad
}
// Create loading view
UIImage *image = [UIImage imageNamed:launchImageName];
if (image) {
UIImageView *imageView = [[UIImageView alloc] initWithFrame:(CGRect){CGPointZero, RCTScreenSize()}];
imageView.contentMode = UIViewContentModeBottom;
imageView.image = image;
rootView.loadingView = imageView;
}
@nicklockwoodã説æããããš
@ideç§ã¯
@ alinz ã @ ideã¯ãlaunchscreen xibã䜿çšããŠRCTRootViewloadingViewãèšå®ããããšãæå³ãããšæããŸãïŒããã¯æåã§è¡ãå¿ èŠããããŸãïŒã ïŒãŸã ïŒãããè¡ãããã®èªåãµããŒãã¯ãããŸããã
æ確ã«ããããã«ãiOSã¯ReactãããŒããéå§ããæç¹ã§èµ·åç»é¢ãé衚瀺ã«ããŸãã 空çœã®ç»é¢ã衚瀺ãããªãããã«ããã«ã¯ãRCTRootViewã®loadingViewãšåããã¥ãŒãæåã§è¡šç€ºããŠãèµ·åç»é¢ã衚瀺ãããæéã延é·ããå¿ èŠããããŸãã
æ確åããŠããã@nicklockwoodã«æè¬ããŸãã ããã¯ç§ã®æªãããšã§ããã :)
http://stackoverflow.com/a/29115477/255765ã®ç€Œåç§ã¯ããã§çµãã£ãïŒ
for (NSString *imgName in allPngImageNames){
// Find launch images
if ([imgName containsString:@"LaunchImage"]){
UIImage *img = [UIImage imageNamed:imgName]; //-- this is a launch image
// Has image same scale and dimensions as our current device's screen?
if (img.scale == [UIScreen mainScreen].scale && CGSizeEqualToSize(img.size, [UIScreen mainScreen].bounds.size)) {
NSLog(@"Found launch image for current device %@", img.description);
UIImageView *launchView = [[UIImageView alloc] initWithImage: img];
rootView.loadingView = launchView;
}
}
}
åäœããŠããããã§ãã
æšæº/ææžåãããæ¹æ³ã®å Žåã¯+1ã
@ dvine-ãã«ãã¡ãã£ã¢ã¯ãäžèšã§æäŸããã³ãŒãã¹ãããããããããŸãæ©èœããŸããïŒ
@myusuf3
@nicklockwoodå®éã圌ãã¯ã»ãšãã©åãããšãããŸãã ç§ãããã調ã¹å§ãããšããç§ã¯ãããããxcodeã®çµéšããŸã£ãããªãããã«ãããªãã®ã¹ããããã©ãããããç解ããŠããŸããã§ããã ãã£ãšäœããã¹ããç解ã§ããããã«ãªã£ããšããããªãããã§ã«ããã«ããããšã«æ°ã¥ããªãã£ãã ããã«å ããŠãç§ã¯å人çã«ãç§ã®ããœãªã¥ãŒã·ã§ã³ãããå°ãèªã¿ããããšæããŠããŸãã ãããããã®çŽç²ãªçŸåŠã
@nicklockwoodã³ãŒããè©ŠããŸãããããŸã çœããã©ãã·ã¥ã衚瀺ãããŸãã ããŒããã¥ãŒãšããŠèšå®ããèµ·åã€ã¡ãŒãžãäœæããŸããã èµ·åã€ã¡ãŒãžã¯launchScreen.xibãšåãã§ãã
ããã¯ç§ãã¡ã®ã¢ããªã®ãªãªãŒã¹ãä¿æããŠããå¯äžã®ãã®ã§ãã ããã«ã€ããŠã®å©ãã«æ¬åœã«æè¬ããŸãã
èµ·åç»åãé衚瀺ã«ãªã£ãåŸã«ãã©ãã·ã¥ã衚瀺ãããŸããããããšãèµ·åç»åã衚瀺ãããŸãããïŒ ïŒããã¯èŠãã ãã§ã¯å€æãé£ããå ŽåããããŸãã念ã®ãããèµ·åç»åãäžæçã«èµ€ãé·æ¹åœ¢ã®ãããªãã®ã«å€æŽããŠãã ããïŒã
@nicklockwoodxibãã¡ã€ã«ãšlaunchScreenã€ã¡ãŒãžã®éã§è²ãå€æŽããããšããŸããã ç§ã¯ãŸã ãã®éå ãèŠãŠããŸããã
ç§ã®ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãïŒ
UIImageView *launchView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"launchScreen1"]];
rootView.loadingView = launchView;
rootView.loadingViewFadeDelay = 0.0;
rootView.loadingViewFadeDuration = 0.15;
æåŸã®2è¡ã®loadingViewFadeDelayãšdurationãåé€ããŸããããåé¡ã¯è§£æ±ºããããã§ãã ãã©ãã·ã¥ã衚瀺ãããŸããã ã¹ã ãŒãºãªç§»è¡ã
@ chirag04ãµã³ãã«ãããžã§ã¯ãã§è©ŠããŠã¿ãŸãããããã©ãã·ã¥ã衚瀺ãããŸããã§ãã:(
ãããç§ãããããšã§ã
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
moduleName:@"whiteFlash"
launchOptions:launchOptions];
//here's what I did
UIImage *image = [UIImage imageNamed:@"LaunchImage"];
if (image) {
UIImageView *launchView = [[UIImageView alloc] initWithImage: image];
launchView.contentMode = UIViewContentModeBottom;
launchView.image = image;
rootView.loadingView = launchView;
}
///////////////////////////
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
UIViewController *rootViewController = [[UIViewController alloc] init];
rootViewController.view = rootView;
self.window.rootViewController = rootViewController;
[self.window makeKeyAndVisible];
return YES;
Okã æ·±ãæãäžãããšããã©ãã·ã¥ã¯ããããéåæã¹ãã¢ããå€ãããŒãããããŸã§ç§ã®ã¢ããªã¯äœãã¬ã³ããªã³ã°ããªãããã§ãã
render() {
if(!this.state.loaded) return (null);
return <View ...../>;
}
loadViewã¯ãjsãã¬ã³ããªã³ã°ãçµäºãããšèŠãªããloadingViewãé衚瀺ã«ãããšæããŸãã ãã ããjsã¯ãã®return null
ã§ã¬ã³ããªã³ã°ãçµäºããŸãã
@ nicklockwood @ alinzç§ã¯ãã 空äžã§æ®åœ±ããŠããŸãã å®éã®çç±ã§ã¯ãªããããããŸããã çããã¯ã©ãæããŸããã
ãŸããloadingViewFadeDelayãªã©ã®å€ã0.30以äžã«èšå®ãããšãé·ç§»ãéåžžã«ã¹ã ãŒãºã«ãªãããšã«æ°ã¥ããŸããã ããã©ã«ãã¯0.25ã§ããããã¹ã ãŒãºã§ãã
loadFadeDelayã®ç®çã¯ãã¢ããªãããã«äœãã¬ã³ããªã³ã°ããªãã·ããªãªãæ£ç¢ºã«ã«ããŒããããšã§ãããããæ£ãã䜿çšããŠããŸãã
ãã ããããã©ã«ããå€æŽãããå Žåã«åããŠãloadingViewFadeDelayãæ瀺çã«èšå®ããããšãæ€èšããããšããå§ãããŸãããŸããããŒãã«æéããããå Žåã«åããŠããµããŒãããæãé ãããã€ã¹ã§ãã¹ãããããã«ããŠãã ããã
@nicklockwoodãœãªã¥ãŒã·ã§ã³ã奜ãã§ãããäºæž¬ã§ããªããããã¯ãŒã¯é 延ãèæ ®ããå¿ èŠããããŸãã
ãã1ã€ã®è§£æ±ºçã¯ãã³ã³ããŒãã³ãã®ç¶æ ãããçš®ã®ããã©ã«ãå€ã«èšå®ããŠãããçš®ã®ããŒããã€ã¢ãã°ã衚瀺ããããã«ã³ã³ããŒãã³ãã«æ瀺ããããšã§ãã
涌ããã ç§ã¯è§£æ±ºçããããšæããŸãã
3ã€ã®ã³ã³ããŒãã³ãããã¹ãŠåãã§ããããšã«ã€ããŠã©ãæããŸããã
1) launchScreen.xib
2) loadingView
3) return null in render to actually render a view which is like loadingView and launchScreen.xib?
ãã ãããã€ã³ã3ãããŸããŸãªããã€ã¹ã§ã©ã®ããã«ã¹ã±ãŒãªã³ã°ããããã¯ããããŸããã çããããããææ¡ããŸããïŒ
èµ·åæéããããã¯ãŒã¯ã«äŸåããŠããå Žåã¯ããã§ãŒãé 延ãããéãããŠã³ããŒããããããšãæåŸ ããã®ã§ã¯ãªããããã«ã空ã®ããã¥ãŒãæç»ããããšã匷ããå§ãããŸãã
asyncstorageã«äŸåããŸãã åå€
ãããã¯ãŒã¯ã«äŸåããŠãããã©ããã«ããããããã¿ã€ã ããŒã¹è¡šç€ºã䜿çšããã®ã¯ããŸã奜ãã§ã¯ãããŸããã èšå®ããæéãæ£ç¢ºã§ããããšã100ïŒ ä¿èšŒã§ããæ¹æ³ã¯ãããŸããã äœããèµ·ãã£ãŠããããšã瀺ãããã«ãåžžã«ãŠãŒã¶ãŒã«äœãã衚瀺ããå¿ èŠããããŸããã衚瀺ããæºåãã§ããŠããŸããã ããã¯åãªãææ¡ã§ãã
åæããŸããã loadViewã®ç®çã¯ãæšæºã®iOSèªã¿èŸŒã¿ç»åãšåæ§ã«ããã¹ãŠã®ã¢ããªã衚瀺ããæºåãã§ããŠããã®ãèªã¿èŸŒã¿ã¹ãããŒã§ãã£ãŠããã¢ããªãäœãã衚瀺ããæºåãã§ãããŸã§ã«ããŒããããšã§ãã
ãšã¯èšããã®ã®ãç§ããããç»åã§ã¯ãªããã¥ãŒã«ããçç±ã¯ãããªãããããééçã«ããããšãã§ããããã«ããããã§ãã å¿ èŠã«å¿ããŠãUIActivityIndiââcatorViewãloadingViewã«è¿œå ã§ããŸãã
æã¡äžãç»åã¯ã©ã®ããã«é 眮ã§ããŸããïŒ ãã¬ãŒã ã®åç¹ã調æŽããŠã¿ãŸããããã©ã®åç¹ã䜿çšããŠãåžžã«äžå€®ã«é 眮ãããŸãã äžã«é 眮ããŠå·Šããå³ã«äŒžã°ãããå°ããªãããããŒã®ç»åããããŸãã
ããã¯ç§ãæã£ãŠãããã®ã§ãïŒ
UIImageView *launchView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LaunchImage"]];
CGRect frame = launchView.frame;
frame.origin.x = 0;
frame.origin.y = 0;
launchView.frame = frame;
rootView.loadingView = launchView;
rootView.loadingViewFadeDelay = 0.0;
rootView.loadingViewFadeDuration = 0.0;
ããã¯èµ·åã€ã¡ãŒãžã§ã¯ãªããèµ·å_view_ã§ãããããimageViewãå¥ã®ã³ã³ãããã¥ãŒå ã«é 眮ããã³ã³ãããèµ·åãã¥ãŒãšããŠäœ¿çšã§ããŸãã
UIView *launchView = [[UIView alloc] init];
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LaunchImage"]];
imageView.frame = CGRectMake(whatever);
[launchView addSubview:imageView];
...
確ãã«ãã©ãããŒã§ç»é¢ã¹ããŒã¹ãåããŠãç»åãäžçªäžã«é 眮ã§ãããšæããŸãã ã©ãããŒã¯ã httpsïŒ//github.com/facebook/react-native/blob/757d6d204ae2d743634af64e3f78a4aad9d53f70/React/Base/RCTRootView.m#L191ã®ããã«èŠããRootViewã«ãã£ãŠèªåçã«äžå€®ã«é 眮ãã
@Intellicodeã¯ãã
@ dvine-multimediaã®ã³ãŒãã䜿çšããŠiphone4sã§æ¬çªç°å¢ã§ã¢ããªãå£ããã ãã§ãã ä¿®æ£ã¯ãifãäžæããããšã§ãã
containsString
ãiOS 7ã§å©çšã§ããªãããããã1ã€ã¯ã©ãã·ã¥ããŸãã
@nicklockwoodã¯ããã¥ãŒã®èªã¿èŸŒã¿ã«ãã£ãŠå¯èœãªéãæé«ã®è§£å床ãèªåçã«éžæããããã©ããçåã«æã£ãŠããŸããïŒ
LoadingViewã¯ç»åããŸã£ããéžæãããæž¡ãããã®ã䜿çšããã ãã§ãããã ããèµ·åã€ããŒãžãèŠã€ããããã«äžèšã§æçš¿ããã¹ããããã¯ãããã€ã¹ã®æ£ãã解å床ãéžæããŸãã
ãã ããã¹ããããã¯æ£ãããµã€ãºã®ãã®ãéžæããŠããŸããã ãã®ããã®ä¿®æ£ã¯ãããŸããïŒ
ç§ã®ãœãªã¥ãŒã·ã§ã³ãŸãã¯dvineã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããŠããŸãããïŒ ã©ã®iPhoneã¢ãã«ã䜿çšããŠããŸããïŒ ããŒãã¬ãŒããŸãã¯ã©ã³ãã¹ã±ãŒãïŒ
dvineã䜿çšãããšãæ£ãã次å ãéžæãããŸãã ç§ãã¡ã®è§£æ±ºçã§ã¯ãç»åã®åšãã«é»ãã¹ããŒã¹ããããŸãã é»ãã¹ããŒã¹ã¯cozã ãšæããŸãããééã£ããµã€ãºã®ç»åãååŸããŸãã
ç§ã¯iPhone6ã䜿çšããŠããŸããããŒãã¬ãŒãã
ããã¯ãããã©ã®ããã«èŠãããã§ãã çœãèæ¯ã«æ³šæããŠãã ããã
次ã®ã³ãŒãã䜿çšããŸãã
UIImageView *launchView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LaunchImage"]];
rootView.loadingView = launchView;
rootView.loadingViewFadeDelay = 0.20;
rootView.loadingViewFadeDuration = 0.20;
ããã¯ç§ãæçš¿ãã解決çã§ã¯ãããŸããã§ãããããã¯ïŒ
// Get launch image
NSString *launchImageName = nil;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
CGFloat height = MAX(RCTScreenSize().width, RCTScreenSize().height);
if (height == 480) launchImageName = @"[email protected]"; // iPhone 4/4s
else if (height == 568) launchImageName = @"[email protected]"; // iPhone 5/5s
else if (height == 667) launchImageName = @"[email protected]"; // iPhone 6
else if (height == 736) launchImageName = @"[email protected]"; // iPhone 6+
} else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
CGFloat scale = RCTScreenScale();
if (scale == 1) launchImageName = @"LaunchImage-700-Portrait~ipad.png"; // iPad
else if (scale == 2) launchImageName = @"LaunchImage-700-Portrait@2x~ipad.png"; // Retina iPad
}
// Create loading view
UIImage *image = [UIImage imageNamed:launchImageName];
if (image) {
UIImageView *imageView = [[UIImageView alloc] initWithFrame:(CGRect){CGPointZero, RCTScreenSize()}];
imageView.contentMode = UIViewContentModeBottom;
imageView.image = image;
rootView.loadingView = imageView;
}
ããã£ïŒ ç§ã¯ããªãã®ã³ã¡ã³ãã泚ææ·±ãèªãã ãããã®ã«ãšæããŸãã ããªãã®è§£æ±ºçã¯æ©èœããç解ããã®ãç°¡åã§ãã
I've been experimenting with a way to automatically detect the launch image and make this completely automatic, but it's not really ready yet. If you're interested, it looks like this:
å€åããã¯experimenting
ãã®ã§ãã ã©ãããŠèŠéããã®ãããããªãã ç³ãèš³ãããŸããã
ããã§å©ããŠãããŠããããšãã defã¯æ¬¡ã®ããŒãžã§ã³ã§ãã®ã³ãŒãã䜿çšããŸãã ãã¹ãŠã®ã±ãŒã¹ãã«ããŒããŠããããã§ãã 颚æ¯ã¯å¿ èŠãããŸããã
ãããç§ã¯ããã売ã£ãŠããªããšæããŸãã ç§ã¯ãããããããã¯ç§ãã¡ãçŸåšæ¬çªç°å¢ã§äœ¿çšããŠãããã®ã§ãããåââé¡ãªãåäœããŠããããã§ãããšèšã£ãã¯ãã§ã:-)
ãããã¯ç§ãã¡ãçŸåšæ¬çªç°å¢ã§äœ¿çšããŠãããã®ã§ãããšã¯ãã¢ããªã¹ãã¢ã®1ã€æããç§ãã¡ãæã£ãã§ãããã ã¯ã¯ã å¿é ãªãã äžçãæãããã®æ°ããããŒãžã§ã³ãåžžã«ãããŸãã :)
ãšããã§ããã®åé¡ãéããŸããïŒ
詳现ã«ã€ããŠã¯ååã«è°è«ãããŠããã®ã§ããã®ãã±ãããéããŸããããã€ãã®è¯ã解決çããããŸãã
LaunchScreen xibã䜿çšããŠãã人ã«ããã100ïŒ æ確ã«ããããã«ããããæ©èœãããã³ãŒãã次ã«ç€ºããŸãã
UIView* launchScreenView = [[[NSBundle mainBundle] loadNibNamed:@"LaunchScreen" owner:self options:nil] objectAtIndex:0];
launchScreenView.frame = self.window.bounds;
rootView.loadingView = launchScreenView;
ãããã®è¡ãAppDelegate.m
ãã¡ã€ã«ã®application didFinishLaunchingWithOptions
ã¡ãœããã®return YES
ãšããè¡ã®ããäžã«è¿œå ããŸãã
@arnemartã¯ããã®æ¹æ³ãios 8以éã§ã®ã¿
@arnemartããããšãïŒ å®ç§ã«åäœããŸãã
LaunchImage
ã䜿çšããå Žåã¯ãç»åãæ£ããæ¡å€§çž®å°ããããã«frame
ãšcontentMode
äž¡æ¹ãèšå®ããå¿
èŠããããŸãã
UIImageView *launchScreenView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LaunchImage"]];
launchScreenView.frame = self.window.bounds;
launchScreenView.contentMode = UIViewContentModeScaleAspectFill;
rootView.loadingView = launchScreenView;
@arnemartããã®ã³ã¡ã³ããšåæ§ã«ããããã®è¡ãAppDelegate.m
ãã¡ã€ã«ã®application didFinishLaunchingWithOptions
ã¡ãœããã®return YES
ãšããè¡ã®äžã«è¿œå ããŸãã
å€ã RN v.0.11.4ã§ã¯ãã¢ããªãããŒãããåã«ãã¢ããªã¯æåã«é»ãç»é¢ã§èµ·åãã次ã«LaunchScreen.xibã§èµ·åããŸãã iOS 9 w / @ arnemartã®ä¿®æ£https://github.com/facebook/react-native/issues/1402#issuecomment-130236507 ã äœãæ¡ã¯ïŒ
@irfaanã¯ã window.backgroundColorã[UIColor redColor]ã®ãããªãã®ã«å€æŽããŠã¿ãŠãã ãããããã«ãããé»ãè²ããŠã£ã³ããŠããæ¥ãŠããã®ãããããšãä»ã®äœãããæ¥ãŠããã®ããããããŸãã
self.window.backgroundColor = [UIColor redColor];
å
ã®didFinishLaunchingWithOptions
ã¯äœãå€æŽããŸããã§ããã LaunchScreen.xibã®åã¯ãŸã é»ã§ãã ã ãããçªããã§ã¯ãªãã @ nicklockwoodã®ãã
ããããããã°ããããšãã©ã®ããã«å§ããŸããïŒ
ã¢ããªãããŒãããããŸã§ãiOSã¯launchScreen.xibããŸã£ããããŒãããŠããªãããã§ãïŒãã®æç¹ã§ãReactã¯ãããloadingViewãšããŠè¡šç€ºããŠããŸãïŒã
ãã¶ãããã¯Xcodeã®èšå®ãšã©ãŒã§ããïŒ ãããšãiOS9ã®ãã°ã§ããïŒ
ããã€ã¹ã§è©ŠããŸãããããããšãã·ãã¥ã¬ãŒã¿ãŒã ãã§è©ŠããŸãããïŒ
ããããšã@ nicklockwood-ç§ã¯ããã€ã¹ã§åé¡ãçµéšããŠããŸããã ã·ãã¥ã¬ãŒã¿ãŒã§å®è¡ãããšå®å šã«æ©èœããåé€ããŠããã€ã¹ã§å®è¡ãããšæ£åžžã«æ©èœããŸãã æ¬åœã«å¥åŠã§ãã åé¡ãåã³çºçããå Žåã¯ãå床æçš¿ããŸãã
ããã«ã¡ã¯@genexliu ãç»åã®ãLaunchImageãã»ãããImages.xcassets/LaunchImage.launchimage/
ã«è¿œå ããŸãããã貌ãä»ããã³ãŒããLaunchScreen.storyboardãããããæ€åº/䜿çšã§ããŸããïŒã©ã¡ãããµã€ã¬ã³ãã«å€±æããŸãïŒã LaunchScreenã¹ããŒãªãŒããŒãã¯ãèæ¯è²ã衚瀺ãããŠããã®ã§æ£ããèªã¿èŸŒãŸããŠããŸãããåç
§ãããŠããç»åã衚瀺ãããŸããã äœãæ¡ã¯ïŒ
ãŸããXCodeããå®è¡ããŠãããšãã®èµ·åã·ãŒã±ã³ã¹ã¯æ£åžžã«èŠããŸãããcmdè¡ããnatal launch
ãå®è¡ããŠãããšãã¯ãéå§ã·ãŒã±ã³ã¹/äœåãªçœããã©ãã·ã¥ãªã©ã®è¿œå ã®å®è¡ãããããã§ãã
ã¹ããŒãªãŒããŒãã§LaunchImageãèŠã€ãããªããšããç§ã®åé¡ã¯ãæããã«XCodeã®ãã°ã§ããã èµ·åèšå®ããã¢ã»ããã«ã¿ãã°ã䜿çšãã«å€æŽããŠãããã¹ããŒãªãŒããŒãã䜿çšãã«æ»ããšãæ©èœãå§ããŸããã loadingViewFadeDelay
ã¯å¹æããªãããã§ããããã @ genexliuã®ã³ãŒããæ©èœããŠãããã©ããã¯äžæã§ãã
ãããç§ã®ã³ãŒãã§ãïŒ
UIImageView *launchScreenView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Images/LaunchImage"]];
launchScreenView.frame = self.window.bounds;
launchScreenView.contentMode = UIViewContentModeScaleAspectFill;
rootView.loadingView = launchScreenView;
rootView.loadingViewFadeDelay = 5000;
ããã§ããã¹ããŒãªãŒããŒãã®LaunchImageã®è¡šç€ºãšæåã®React render
éã«é
延ã¯ãããŸããã
@ "Images / LaunchImage"ã¯ç§ã«ã¯æ£ããèŠããŸããã ãããã@ "LaunchImage"ã§ã
ããããã£ãšãããã ã ããªããæ£ããã ããã¯èª€ã£ã貌ãä»ãã§ãã-ç§ãè©Šããé åã®1ã€ã§ãïŒæåã§ã¯ãããŸããïŒã
ãŸããäžèšã®3ãæåã®ã³ã¡ã³ãã®ãµã³ãã«ã³ãŒãã確èªããŠãã ãããããŸããŸãªããã€ã¹ã¯ã©ã¹ã®èµ·åã€ã¡ãŒãžãã¡ã€ã«ããããããããŸãã
ããŒïŒ åã¯æ£ããã£ãã LaunchImage
ã«åãæ¿ããåŸãçŸåšã¯æ©èœããŠããŸãã ã©ããïŒ
誰ããAndroidçšã®ããã«é¢ããããã¥ã¡ã³ããæããŠããããŸããïŒ
Androidã®å Žåã¯+1
cc @dmmiller Androidã«loadingViewæ©èœã¯ãããŸããïŒ
ããã«ã¡ã¯ãç§ã¯ãããšåãåé¡ã«çŽé¢ããŠããŸããããã«ããã€ãã®è§£æ±ºçãæçš¿ãããŠããããã«èŠããŸããããã®ã³ãŒããã©ãã«çœ®ãã¹ããããããŸããã ç§ã®ç解ã§ã¯ã解決çã¯Objective-Cã³ãŒããå€æŽããããšã§ãããReact Nativeèªäœã§å®è¡ã§ããããšã§ã¯ãããŸããã ãã®å Žåãæçš¿ãããã³ãŒãã¯ã©ãã«è¡ããŸããïŒ xcodeãããžã§ã¯ãã«ãŒãã®main.mãã¡ã€ã«ã«ãããŸããïŒ ããããšãã
@CorpusCallosumã³ãŒãã¯ãRCTRootViewãèšå®ãããŠããAppDelegate.mãã¡ã€ã«ã«é 眮ããå¿ èŠããããŸãã
@nicklockwoodã«æè¬ã
çœããã©ãã·ã¥ã衚瀺ããããç»åãæåã®ç»é¢ã«èªã¿èŸŒãŸããŠããéãããã®ã³ãŒãã¯æ©èœããŠããŸãããå®éã®ã¢ããªã¯èªã¿èŸŒãŸããŸããã ããã¯ããŒãç»é¢ã«ãšã©ãŸããŸããã³ã³ãœãŒã«ã§èŠãããšãã§ããŸãããã¢ããªã¯ããŒããããŠå®è¡ãããŠãããã€ã³ã¿ã©ã¯ã·ã§ã³ãæ©èœããŠããŸãïŒã¿ããããŠã¹ã¯ã€ãïŒããå®éã«ã¯ã¢ããªããŸã£ããèŠãããšãã§ãããã¹ã¿ãã¯ããŠããŸããã®åæç»é¢ã§ã ãªãã§ããïŒ
AppDelegate.mãã¡ã€ã«ã®ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
UIViewController *rootViewController = [[UIViewController alloc] init];
rootViewController.view = rootView;
self.window.rootViewController = rootViewController;
[self.window makeKeyAndVisible];
//use launch image as BG image for app
UIImageView *launchScreenView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LaunchImage-blank-grey"]];
launchScreenView.frame = self.window.bounds;
launchScreenView.contentMode = UIViewContentModeScaleAspectFill;
rootView.loadingView = launchScreenView;
rootView.loadingViewFadeDelay = 1000;
return YES;
@CorpusCallosumè¡ãåé€ããŠã¿ãŠãã ããrootView.loadingViewFadeDelay = 1000;
ãŸãã¯ãã¹ãã©ãã·ã¥ç»é¢ãšã¢ããªã®éã®é·ç§»ããã®å€ã§åŸ®èª¿æŽããŸãïŒåäœã¯ããªç§ã§ã¯ãªãç§ã§ãããšæããŸããããããã¹ãã©ãã·ã¥ã§ãã¹ã¿ãã¯ãããŠããããã«èŠããçç±ã§ãïŒã
è¡ãå®å
šã«åé€ããŠãæ©èœããªãå Žåã¯ã0ã5ã®å€ãèšå®ããŠã¿ãŠãã ããïŒæŽæ°ä»¥å€ã®å€ãèšå®ã§ããŸãïŒã
ç§ã®ããã«åããŠãã¿ããªããããšã:)
launchscreen xibãloadingViewãšããŠäœ¿çšãããå Žåã¯ãAppDelegate.mã«æ¿å ¥ããã³ãŒãã次ã«ç€ºããŸãã
UIView *loading = [[[NSBundle mainBundle] loadNibNamed:@"LaunchScreen" owner:self options:nil] objectAtIndex:0];
rootView.loadingView = loading;
rootView.loadingViewFadeDelay = 1;
æåŸã®è¡ã¯ãªãã·ã§ã³ã§ããåè¿°ããããã«ãã¢ããªèªäœã«ç§»åããåã«loadingViewãçãŸãæéãèšå®ããŸãã
@ david-ããããšãããããŸããïŒ ç§ã¯reactnativeã®ãã¹ããå§ããŠä»¥æ¥ãããã«åãçµãã§ããŸããã ð
@ david-aã@ geriux ïŒLaunchScreen.xibã«AspectFillã³ã³ãã³ãã¢ãŒãã®èæ¯ç»åããããæ£ããã¹ã±ãŒãªã³ã°ãããŠããªãã£ãããã launchScreenView.frame = CGRectZero;
ãèšå®ããå¿
èŠããããŸããã äœåºŠãè©Šè¡é¯èª€ããŠè§£æ±ºçã«ãã©ãçããŸããããäœãåå ãããããŸããã
@BasitAliã¯ããç³ãèš³ãããŸããããããã¯ããé©åã«ææžåããå¿ èŠããããŸãã ãã¥ãŒã®ãµã€ãºããŒã以å€ã«èšå®ãããšãç»é¢ã®äžå€®ã«é 眮ãããŸãã ãŒãã«èšå®ãããšãç»é¢ã«åãããŠæ¡å€§çž®å°ãããŸãã
@ david-ã©ããããããšãããããŸããïŒ ã³ã¡ã³ãã¯ãã€ã©ãŒãã¬ãŒãã«å«ããããå°ãªããšãã¡ã€ã³ã®ReactNativeããã¥ã¡ã³ãã®äžéšã«ããå¿ èŠããããŸãã ãã®åé¡ã2015幎3æã«ã¯ããŒãºãããçç±ã¯ããããŸãããã2016幎2æã®RN0.20ã«ãŸã ååšããŠããããšã¯æããã§ãã
誰ããããã¥ã¡ã³ãã®PRãããŠããããšããã§ããã
ããªããã¡ã®ã¢ããã€ã¹ã¯ç§ã倧ãã«å©ããŠãããŸãïŒIOSã§ã¯å®ç§ã«åäœããŠããŸãïŒãAndroidã§ãããä¿®æ£ããæ¹æ³ãèŠã€ãã人ã¯ããŸããïŒ
ããã¯å©ãã«ãªããŸããïŒ
@ weiyisheng ãAndroidã§ã¯@bracoãææ¡ããããã«ãiOSã§äžèšã®ä¿®æ£ãšãšãã«react-native-splashscreenã䜿çšããŠããŸãã
@braco @BasitAliã¯ãã圹ã«ç«ã¡ãŸãããã¢ããªã§äœ¿çšããŸããè¯ãã¢ã€ãã¢ã§ãã ã¿ããªããããšãã
@BasitAli奜å¥å¿ããiOSã§äœ¿ã£ãŠã¿ãŸãããïŒ
ç§ã®ã¢ããªã±ãŒã·ã§ã³ã¯ãã¹ãã©ãã·ã¥ç»é¢ãããã°ã€ã³ç»é¢ã«ã·ãŒã ã¬ã¹ã«ã¢ãã¡ãŒã·ã§ã³åãããŸãïŒããŽãäžã«ç§»åãããã°ã€ã³ãã£ãŒã«ããé£ã³åºããŸãïŒã rn-splashscreenãã©ã°ã€ã³ããã§ãŒãã¢ãŠãããŸãããããã¯ç§ã®ã¢ãã¡ãŒã·ã§ã³ãšããŸã調åããŸããã ä»ã«éžæè¢ããªãã£ãã®ã§ãAndroidã§äœ¿çšããå¿ èŠããããŸããã
@BasitAliããã¯ãreact-native-splashscreenãã©ã°ã€ã³ãrootView.loadingViewFadeDuration
èšå®ã«åŸã£ãŠããããã«èŠããŸãããã ããæ¥ç¶åŸã«èšå®ãããšããã§ãŒããç¡å¹ã«ãªããŸãã
[RCTSplashScreen show:rootView];
rootView.loadingViewFadeDuration = 0;
ãäºåã«ãã³ãã«ããããã¡ã€ã«ããèªã¿èŸŒãã§ããŸãããšããäžéšã®å°ããªã¡ãã»ãŒãžãåé€ããæ¹æ³ã¯ãããŸããïŒ
@rclaiããªãªãŒã¹ããã¹ããŒã ãèšå®
ããïŒ ããããšãïŒ
äž¡æ¹ã®ãã©ãããã©ãŒã ã®ã¹ãã©ãã·ã¥ã¹ã¯ãªãŒã³ã«å¯Ÿå¿ãããã€ãã£ããœãªã¥ãŒã·ã§ã³ã¯ãããŸããïŒ äž¡æ¹ã®ãã©ãããã©ãŒã ã®å éšãã¡ã€ã«ã«å ¥åãããšãreact-nativeã䜿çšã§ããªããªããŸããç°¡åãªçãããé¡ãããŸãã ããããšã
@rclai
ãäºåã«ãã³ãã«ããããã¡ã€ã«ããèªã¿èŸŒãã§ããŸãããšããäžéšã®å°ããªã¡ãã»ãŒãžãåé€ããæ¹æ³ã¯ãããŸããïŒ
ããã¯ãªãªãŒã¹ã¢ãŒãã§ã¯è¡šç€ºãããããããã°ã¢ãŒãã§ã®ã¿è¡šç€ºãããŸãã ãããã°ã¢ãŒãã§ãé衚瀺ã«ããå Žåã¯ãAppDelegateã«[RCTDevLoadingView setEnabled:NO];
ãå
¥ããŠé衚瀺ã«ããããšãã§ããŸãã
@nicklockwoodããã«ã¡ã¯ãããã¯æ£ããã§ããïŒ ããã§ãªãå Žåãäœãå€æŽ/åé€ããå¿ èŠããããŸããïŒ
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
moduleName:@"SomeApp"
initialProperties:nil
launchOptions:launchOptions];
// Get launch image
NSString *launchImageName = nil;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
CGFloat height = MAX(RCTScreenSize().width, RCTScreenSize().height);
if (height == 480) launchImageName = @"[email protected]"; // iPhone 4/4s
else if (height == 568) launchImageName = @"[email protected]"; // iPhone 5/5s
else if (height == 667) launchImageName = @"[email protected]"; // iPhone 6
else if (height == 736) launchImageName = @"[email protected]"; // iPhone 6+
} else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
CGFloat scale = RCTScreenScale();
if (scale == 1) launchImageName = @"LaunchImage-700-Portrait~ipad.png"; // iPad
else if (scale == 2) launchImageName = @"LaunchImage-700-Portrait@2x~ipad.png"; // Retina iPad
}
// Create loading view
UIImage *image = [UIImage imageNamed:launchImageName];
if (image) {
UIImageView *imageView = [[UIImageView alloc] initWithFrame:(CGRect){CGPointZero, RCTScreenSize()}];
imageView.contentMode = UIViewContentModeBottom;
imageView.image = image;
rootView.loadingView = imageView;
}
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
UIViewController *rootViewController = [UIViewController new];
rootViewController.view = rootView;
self.window.rootViewController = rootViewController;
[self.window makeKeyAndVisible];
return YES;
}
@TeodorKolevã¯ç§ã«ã¯
rootView.loadingViewFadeDelay
ãã倧ããªå€ã«ïŒç§åäœ-ããã©ã«ãã¯0.25ïŒ
ç·šéïŒ
ãã®è¡
UIImageView *imageView = [[UIImageView alloc] initWithFrame:(CGRect){CGPointZero, RCTScreenSize()}];
ãã¶ã
UIImageView *imageView = [[UIImageView alloc] init];
ããããšãããããã®ç»åãè¿œå ãããã©ã«ãã¯ã©ãã§ããïŒ ããã«ã¯è¿œå ã®Contents.jsonãå¿
èŠã§ããïŒ ãã®ã³ãŒãã§è€æ°ã®ãšã©ãŒãçºçããŸãã
ïŒhttps://cloud.githubusercontent.com/assets/10398337/13778676/e01e3d32-eabf-11e5-95bf-d7a1205a5ca1.pngïŒ
èŠã€ããïŒ
CGFloat height = MAX(RCTScreenSize().width, RCTScreenSize().height);
@TeodorKolev Xcodeã«ã¯ãããããè¿œå ããããã®GUIããããŸãã Images.xcassetsãã¯ãªãã¯ãã[+]ãã¿ã³ãã¯ãªãã¯ããŠã[ã¢ããªã¢ã€ã³ã³ãšèµ·åç»å]> [æ°ããiOSèµ·åç»å]ãéžæããŸãã
@TeodorKolevãšã©ãŒãä¿®æ£ããã«ã¯ãè¿œå ããå¿ èŠããããŸã
#import "RCTUtils.h"
AppDelegateã§ã
ã©ããããããšãããããŸããããWebViewã®URLãå®å šã«èªã¿èŸŒãŸãããŸã§ã¹ãã©ãã·ã¥ç»é¢ã衚瀺ãããã®ã§ãããçŸåšã¯ãã®ããã«æ©èœããŠããŸããã å°æ¬ïŒ
@nicklockwoodããã«å¯Ÿããææžçã¯ãããŸããïŒ
ãããä¿®æ£ããããã®çŸåšã®æ¹æ³ã¯äœã§ããïŒ åé¡ãçºçããŠãã1幎ãšæ°ãæãçµã¡ãŸããããå®éã«ä¿®æ£ããããšã¯æããªãã®ã§ãçŸåšã®è§£æ±ºçã¯äœããšæããŸãã ã©ã®ãã¡ã€ã«ãå€æŽããå¿ èŠããããã©ã®ã³ãŒããå€æŽããå¿ èŠããããŸããïŒ
ç·šéïŒlaunchscreen.xibã§é»ãç»é¢ã䜿çšããŠããŸãããã¢ããªãå®å šã«èªã¿èŸŒãŸããåã«ãéäžã§çœã«å€ãããŸãã
@ hasen6ãã®åé¡ã¯ãã§ã«ä¿®æ£ãããŠããŸãããéçºè ã®åŽã§ããã€ãã®äœæ¥ãå¿ èŠã§ãã
äžèšã®ã³ã¡ã³ãã§è¿°ã¹ãããã«ãããªããèšå®ããå¿
èŠããããŸãrootView.loadingView
çœãç»é¢ã®ä»£ããã«è¡šç€ºãã調æŽããããã«ãäžéšã®ã³ã³ãã³ãã§rootView.loadingViewFadeDelay
ããŒããã¥ãŒã¯ãããªãã®åã«é ãããŠããªãããšã確èªããããã«ãã¢ããªã®èªã¿èŸŒã¿ãå®äºããŸããã
é»ãç»é¢ã衚瀺ãããã ãã®å Žåã¯ãloadingViewãæ°ã«ããå¿
èŠã¯ãªãã rootView.backgroundColor
ãé»ã«èšå®ããã ãã§ãããå®éšããå¿
èŠããããŸãã
rootView.backgroundColor = [UIColor clearColor];
ãrootView.backgroundColor
= [UIColorblackColor]ã«å€æŽããŸãã; but it didn't make any difference. Doing a search in XCode for
rootView.loadingView`ã¯çµæãè¿ããŸããã§ããã
@ hasen6çœãè²ãã©ãããæ¥ãŠããã®ããç解ããå¿ èŠããããŸã-JSã¢ããªå ã«çœããã¥ãŒããããã³ã³ãã³ããèªã¿èŸŒãŸããåã«ãã°ãã衚瀺ãããŠããå¯èœæ§ããããŸãã
loadingView
ã¯RCTRootView
ããããã£ã§ãããããããAppDelegateå
ã«ã€ã³ã¹ã¿ã³ã¹ããããŸãã å®éã®ã³ãŒãrootView.loadingView
ã¯ãèªåã§è¿œå ããªãéããXcodeã«è¡šç€ºãããŸããã 䜿çšæ¹æ³ã®äŸã次ã«ç€ºããŸãã
rootView.loadingView = [UIView new];
rootView.loadingView.backgroundColor = [UIColor blackColor];
rootView.loadingViewFadeDelay = 0.5; // measured in seconds
ç§ã®ã¢ããªã¯ã©ãã§ãçœã§ã¯ãããŸããã èµ·åç»é¢ã衚瀺ãããåŸããã¹ãŠã®ã¢ããªãããŒãæã«åãçœãç»é¢ã衚瀺ããã®ã§ãã¢ããªã«åé¡ã¯ãªããšç¢ºä¿¡ããŠããŸãã
ã ããç§ã¯ãã®ã³ãŒããappdelegate.mã«è¿œå ããå¿ èŠããããŸããïŒ ãããããŸããããŸããã§ããã ä¿®æ£ããã®ã¯ã»ãŒäžå¯èœã ãšæããŸããããããªããšãéçºè ããŸã 解決ããŠããªãç¶æ ã§1幎ãçµéããŠããªãã£ãã§ãããã ã¢ããªã®èŠæ ããããã«æªãããèãããšãæããã«è§£æ±ºãã¹ããªã¹ãã®ãããã«ãªããŸãã
FWIWããããç§ããã®åé¡ã解決ããæ¹æ³ã§ãã ç§ã¯LaunchScreen.xibãšDavid-aã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããŠããŸãïŒ
UIView *loading = [[[NSBundle mainBundle] loadNibNamed:@"LaunchScreen" owner:self options:nil] objectAtIndex:0];
rootView.loadingView = loading;
rootView.loadingViewFadeDelay = 1;
ãã®ã³ãŒãã¯ããäžã«æ¿å ¥ãããŸã
RCTRootView *rootView = [[RCTRootView alloc] etc etc etc...]
ãã®ã³ãŒããnicklockwoodã®ãµã³ãã«ã³ãŒãã«çœ®ãæãããšãçœããã©ãã·ã¥ãè¿ãããŸãã
ãããŒïŒ ããããŸããã grittathhã«æè¬ããŸãïŒ
@grittathh @ hasen6ããã
@ hasen6ã¯ãåäœããã¯ãã®ã³ãŒãã®ä¿®æ£ããŒãžã§ã³ã§ãïŒxibãœãªã¥ãŒã·ã§ã³ãåé¡ãããŸããããé»ãç»é¢ã䜿çšããŠããå Žåã¯åé·ã§ãïŒã
rootView.loadingView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
rootView.loadingView.backgroundColor = [UIColor blackColor];
rootView.loadingViewFadeDelay = 0.5; // measured in seconds
泚ïŒ1ã¯ããŠãŒã¶ãŒãã¢ããªãèµ·åããåã«ããã«1ç§åŸ ã€å¿ èŠãããããšãæå³ãããããloadingViewFadeDelayã®å€ã¯éåžžã«å€§ãããªããŸãã åé¿ã§ããæå°å€ã«èšå®ããããšããå§ãããŸãïŒ0.25ãããã©ã«ãã§ãããã»ãšãã©ã®ã¢ããªã§åé¡ãããŸããïŒã
ã¯ãã1ãå°ãé·ããã¢ããªã®1ã€ã§ãªãŒããã³ã°ã¢ãã¡ãŒã·ã§ã³ãæ¬ èœããŠããããšãããããŸããã 0.1ã§ã倧äžå€«ã ãšæããŸããã ãååããã ãããããšãããããŸãã
@ hasen6ã«åæããŸãã ãŠãŒã¶ãŒãããã«Objective-CïŒ AppDelegate.m
ïŒã«é£ã³èŸŒãã§ãReact Nativeã¢ããªãçæãããããã«ã³ãŒãã埮調æŽããªããã°ãªããªãã®ã¯ã確ãã«å°ãå¥åŠã«æããŸãã React Nativeãããã®ä¿®æ£ããã§ã«çµã¿èŸŒãŸããŠããã³ãŒããçæããããšã¯å¯èœã§ã¯ãªãã§ããããïŒ ãŸãã¯ãJavaScriptïŒãŸãã¯å®£èšåæ§æèšèªïŒããã®éå§ç»é¢æ§æã®ããæœè±¡çãªãœãªã¥ãŒã·ã§ã³ãå°å
¥ããã«ã¯ïŒ
@johanatanç®èãªããšã«ãReact Nativeã®2ã€ã®æ倧ãã€æãé·ãç¶ãåé¡ã¯ãããçš®ã®çœããã©ãã·ã¥ã«é¢ä¿ããŠããŸãã ãã®ãšã©ãŒãšç»åã®çœãç¹æ» ã
LaunchScreen xibã䜿çšãããšã倧ãããªãåŸåããããŸããã解決çã¯ãããŸããïŒ
äœã倧ãããªãåŸåããããŸããïŒ
UIView * load = [[[NSBundle mainBundle] loadNibNamedïŒ@ "LaunchScreen" ownerïŒself optionsïŒnil ] obje ctAtIndexïŒ0 ];
rootView.loadingView =èªã¿èŸŒã¿äž;
èªã¿èŸŒã¿äžã®UIãã¥ãŒããµã€ãºãå€æŽãããŠããªãããã§ããLaunchScreen.xibã§ããã¹ãã©ãã·ã¥ç»é¢ãšåãã§ãããšæ³å®ãããŸãã
ãµã€ãºã¯ã©ã¹ãšå¶çŽã䜿çšããŠããŸããšããã§
æ£ãã@ akoshdee-ç»é¢ãµã€ãºãšäžèŽããããã«ãã¥ãŒãµã€ãºãæ瀺çã«èšå®ããå¿ èŠããããŸãã 䜿çšãã
loading.frame = [UIScreen mainScreen].bounds;
ãã§ã«ãã¬ãŒã ãå€æŽããŸããããããã§ãæ©èœããŸãã
ã¢ã³ããã€ãã®ããã®è§£æ±ºçã¯ãããŸããïŒ
@ajoshdee loadingView.frame = [UIScreen mainScreen].bounds;
å²ãåœãŠã¯ç§ã«ã¯æ©èœããŸããã§ããããããã¯æ©èœããŸããïŒ loadingView.frame = self.window.bounds;
ããã¯ç§ã䜿çšããŠãããã®ã§ãïŒ
NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"LaunchScreen" owner:self options:nil];
UIImageView *loadingView = [nibObjects objectAtIndex:0];
loadingView.frame = self.window.bounds;
rootView.loadingView = loadingView;
ããã«ã¡ã¯ïŒ ãã¥ãŒã«åå¿ããããã«è²ãèšå®ããŸããïŒ
rootViewController.view.backgroundColor = [UIColor blackColor];
@ py110 @ajwhite
Androidã®ãœãªã¥ãŒã·ã§ã³ã¯ããããç解ããã®ã«ã©ãã ãã®æéãããã£ããã«ã€ããŠèªåèªèº«ã«æ©ãŸãããã»ã©ãã°ãããŠåçŽã§ãã
ããã«ã¯ã3段éã®ã¹ãã©ãã·ã¥ã¹ã¯ãªãŒã³ãå«ãŸããŸãã
ç§ã¯åæ§ã®å®è£
@mehcodeãæã£ãŠããŸãã-ç§ã¯ããªããããã«æã£ãŠãããã®ã奜ãã§ãã RNã€ã³ã¹ã¿ã³ã¹ãããŒãžã£ãŒã«ã¢ã¯ã»ã¹ããæ¹æ³ãæ¢ããŠããŸãããã getReactNativeHost()
åŒã³åºãããã£ãããšã¯ããããŸãã
ç§ã¯æ¬¡ã®ããšãããŸããïŒããã«ã€ããŠã¯æºè¶³ããŠããŸããïŒ
SplashActivity
ã¯ã¢ããªãéãããšãã«éå§ãããŸããMainActivity
ãšfinish()
ããã«éããŸãMainActivity
ã¯ã MainActivity
äžã«ã¹ãã©ãã·ã¥ã衚瀺ããå§ãããšããã«ãããã©ã¢ã°ã©ãŠã³ãã¢ãŒããã§ããããšã瀺ããã©ã°ã§SplashActivity
ãéå§ããŸãã ãã°ãããããšã SplashActivity
ãéããŠãã¢ããªã衚瀺ãããŸãã@ajwhite
ããããšãã å¹æã¯éåžžã«ã¹ã ãŒãºã§ãã
çŸåšã®ãããžã§ã¯ãã§ã¯ãæåéãReactActivity
ã³ãŒãããŒã¹ã«ã³ããŒãã mReactInstanceMangager
ããã©ã€ããŒãã§ã¯ãªãä¿è·ããŸããã
react-native 0.29ïŒã³ã¡ã³ãã§èšã£ãŠããã¯ãã§ãïŒã§ã¯ãreact NativeããŒã ã¯ãããã«å
¥ãããã®ãããªãã¯ã¡ãœããgetReactNativeHost()
ãæäŸããŠãããŸããã
ãã®ReactNativeHost
ã³ã³ããã¯çŽ æŽãããåãã§ãã ããã¯ãŸãã«ç§ãééããåé¡ã§ã-MainActivityããã©ã€ããµã€ã¯ã«ã«ããã¯ããããšãã§ããŸããã
èå³ã®ããæ¹ãžã®åç §ïŒ https ïŒ
ããã«è¿œå ããã«ã¯...
ç§ãèŠã€ãã解決çã¯ã rootView
ã«èæ¯è²ãå²ãåœãŠã [UIColor colorWithPatternImage:img]
ã
ããã¯ãå®å šã«ããŒãããããŸã§è¡šç€ºããããŸãŸã«ãªãããã«ããããã®é 延ãå¿ èŠãšããŸããã
ããã€ã¹ã«å¿ èŠãªLaunchImageãèŠã€ããå®å šãªã¹ããããïŒããã³@ dvine-multimediaãæäŸãããã³ãã䜿çšïŒã¯æ¬¡ã®ãšããã§ãã
NSArray *allPngImageNames = [[NSBundle mainBundle] pathsForResourcesOfType:@"png" inDirectory:nil];
for (NSString *imgName in allPngImageNames){
if ([imgName containsString:@"LaunchImage"]){
UIImage *img = [UIImage imageNamed:imgName];
if (img.scale == [UIScreen mainScreen].scale && CGSizeEqualToSize(img.size, [UIScreen mainScreen].bounds.size)) {
rootView.backgroundColor = [UIColor colorWithPatternImage:img];
}
}
}
LaunchImageã¯ãreact-nativeãã³ãã«ãå®å šã«ããŒãããããŸã§è¡šç€ºããããŸãŸã«ãªããŸãã
ç§ã¯ãã®äŒè©±ã®ã»ãŒãã¹ãŠã®ã³ãŒããããã¯ããã£ã³ã¹ãªãã§è©ŠããŸããããããã¯å®å
šã«æ©èœããŸããã
ããããšã@ dbonner1987 ïŒ
ã¢ã³ããã€ãã®ããã®è§£æ±ºçã¯ãããŸããïŒ
@ pareekkhushboo77 https://github.com/mehcode/rn-splash-screen/blob/master/docs/android.md
@sercanov @ dbonner1987ããã¯ãiOSã§äžèšã®ã¢ãããŒãã䜿çšããŠãjavascriptã®èµ·åç»é¢ãå®è¡ããŸãã
@arnemartããããšãããŸã RN0.30.0ã§åäœããŸãã ã¢ããªãåé€ããŠåã€ã³ã¹ããŒã«ããå¿ èŠããããŸããã åããŠçœãç¹æ» ããŸãããããã®åŸã¯ãããŸããã§ããã
@nicklockwoodå®éã®JavaScriptããã€ããŒããããããç¥ãããã«äœ¿çšã§ããã³ãŒã«ããã¯ã®ãããªãã®ã¯ãããŸããã ããã¯ãã¢ããªãããŒãžéã移åããŠãããšãã«ããã¥ãŒã®èæ¯ã«rootView.backgroundColorã衚瀺ãããéæ床ãããããã§ãã ããã¯ãŒãªãŒãã³ãã©ã³ãžã·ã§ã³äžã«äœ¿çšããŠããããã¯ãŒãã©ã°ã€ã³ã§ãåæ§ã®åé¡ãçºçããŸãã
ã ããç§ã¯æ¬¡ã®ãããªããšãããããšæããŸãïŒ
ãããã£ãŠãåºæ¬çã«ãããŒãããã€è¡ãããããç¥ãããã®ã³ãŒã«ããã¯ãå¿ èŠã§ãã
@ UKDeveloper99äžèšã§ãªã³ã¯ããããã¥ã¡ã³ããæ°ååç §ããŠãã ããã å©çšå¯èœãªãã®ãããªã³ãŒã«ããã¯ããããŸãã
https://github.com/mehcode/rn-splash-screen/blob/master/docs/android.md
@mehcodeããã¯å®ç§ãªæè¬ã§ã!!
ãã³ãã«ãããŒãããããšãªãã«ãªãLaunchScreen.storyboard
ãå®è£
ããæ¹æ³ã«ã€ããŠèª°ãææ¡ããããŸããïŒ çŸåšãäžå®æé衚瀺ãããåŸãçœãç»é¢ã衚瀺ãããã¢ããªã±ãŒã·ã§ã³ãRN 34.1 xcode8ãããŒãããŸãã
@ajoshdeeåæ§ã®åé¡ãçºçãããã¥ãŒãç»é¢ãããã¯ããã«å€§ãããªã£ãŠããŸããŸããã é¢é£ããŠãããã©ããã¯ããããŸãããã LaunchScreen.xib
AutoLayoutã䜿çšããŠããŸããã
ç§ãèšå®ããå¿ èŠããããŸãã
launchScreenView.autoresizingMask = UIViewAutoresizingNone;
é©åãªãµã€ãºã«ããããã
ãããã£ãŠã httpsïŒ //github.com/facebook/react-native/issues/1402#issuecomment -166963438ã«ãäžèšã®è¿œå è¡ãè¿œå ããŸã
appdelegate.mã®ãã®è¡ã眮ãæããããšã§èµ·åè²ãæŽæ°ããããšãã§ããŸãïŒ
rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
ãã®è¡ã§ïŒ
rootView.backgroundColor = [[UIColor alloc] initWithRed:0.94 green:0.90 blue:0.89 alpha:1.0];
ãã®ãŠã§ããµã€ãã§ããªããæãè²ãèŠã€ã
誰ããAndroidã§ããã解決ããããã«ç®¡çããŸãããïŒ
iOSãšAndroidã®äž¡æ¹ã®ãœãªã¥ãŒã·ã§ã³ã¯æ¬¡ã®ãšããã§ãïŒ https ïŒ
app.tsxïŒãšã³ããªãã€ã³ãïŒã®ã¬ã³ããªã³ã°æ©èœã§ã¹ãã©ãã·ã¥ç»é¢ãé衚瀺ã«ãããã¹ãŠã®httpsãªã¯ãšã¹ããå®äºãããŸã§åãç»åã衚瀺ããŸããã
ç§ã®ã³ãŒãïŒ
`` `
public renderïŒïŒ
{{
SplashScreen.hideïŒïŒ;
//after everything has finished loading - show my app.
if (this.state.isFinishedloading)
{
return (
<this.navigator screenProps={{ ...providers }} />
);
}
// Until then show the same image as the splash screen with an ActivityIndicator.
return (
<View style={{ flex: 1 }}>
<Image style={styles.image} source={require('../assets/img/splash.png')} >
<ActivityIndicator style={styles.indicator} color="#fff"></ActivityIndicator>
</Image>
</View>
);
}
`` `
ã¹ãã©ãã·ã¥ç»é¢ã«ã¹ããŒãªãŒããŒãã䜿çšããŠããå Žåãããã«å¯Ÿãã解決çã¯ãããŸããïŒ åãã£ã¡ã³ã·ã§ã³ã®èµ·åç»é¢ã®ç»åã¯ãããããŸããã
AppDelegate.m
å
ã®iOSã®react nativeã§ãããã«å¿ããŠRGBã«ã©ãŒã³ãŒããèšè¿°ããŠæ¬¡ã®è¡ãå€æŽããŸãã
rootView.backgroundColor = [[UIColor alloc] initWithRed:52.0f/255.0f green:73.0f/255.0f blue:94.0f/255.0f alpha:1];
REDã®å Žåã¯ãçªå·52ãå€æŽããŸã
GREENã®å Žåã¯çªå·73ãå€æŽããŸã
éã®å Žåã¯çªå·94ãå€æŽããŸã
_泚ïŒç§ã¯react nativev0.51.0ã䜿çšããŠããŸã_
Androidçšã®ãœãªã¥ãŒã·ã§ã³ã¯ãŸã ãããŸãããïŒ
@ otoinsa @ neomibã«ããäžèšã®åçhttps://github.com/facebook/react-native/issues/1402#issuecomment-339336380ãåç §ããŠhttps://github.com/crazycodeboy/react-native-splash-screenãªã©ã§ãåæ§ã«æ©èœããã¹ãã©ãã·ã¥ç»é¢ã©ã€ãã©ãªãä»ã«ãããã€ããã
LaunchScreenãšããŠäœ¿çšãããã¹ããŒãªãŒããŒãã«é¢ããææ¡ã¯ãããŸããïŒ
ç§ã®ã¢ãããŒãã¯ãã®ãããªãã®ã§ããïŒããããã¢ããªã¯èµ·åæã«ã¯ã©ãã·ã¥ããŸãïŒ
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSURL *jsCodeLocation;
[Fabric with:@[[Crashlytics class]]];
jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
moduleName:@"MyApp"
initialProperties:nil
launchOptions:launchOptions];
rootView.backgroundColor = [UIColor clearColor];
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// UIViewController *rootViewController = [UIViewController new];
UIStoryboard *storyboard = self.window.rootViewController.storyboard;
UIViewController *rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"the_storyboard_id"];
rootViewController.view = rootView;
self.window.rootViewController = rootViewController;
[self.window makeKeyAndVisible];
return YES;
}
次ã®ãšã©ãŒã§ã¢ããªãã¯ã©ãã·ã¥ããŸãã
2018-03-30 11:21:04.995601+0530 MyApp[6119:101967] Running application MyApp ({
initialProps = {
};
rootTag = 1;
})
2018-03-30 11:21:05.014109+0530 MyApp[6119:101967] *** Assertion failure in -[UIApplication _runWithMainScene:transitionContext:completion:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3698.33.6/UIApplication.m:3529
2018-03-30 11:21:05.090174+0530 MyApp[6119:101967] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Application windows are expected to have a root view controller at the end of application launch'
*** First throw call stack:
(
0 CoreFoundation 0x000000011170f12b __exceptionPreprocess + 171
1 libobjc.A.dylib 0x0000000110001f41 objc_exception_throw + 48
2 CoreFoundation 0x00000001117142f2 +[NSException raise:format:arguments:] + 98
3 Foundation 0x000000010faa2d69 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 193
4 UIKit 0x000000010d838051 -[UIApplication _runWithMainScene:transitionContext:completion:] + 3102
5 UIKit 0x000000010dc016f8 __111-[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:]_block_invoke + 924
6 UIKit 0x000000010dfd74c8 +[_UICanvas _enqueuePostSettingUpdateTransactionBlock:] + 153
7 UIKit 0x000000010dc012f1 -
ããããšãã
亀ææžã¿
UIStoryboard *storyboard = self.window.rootViewController.storyboard;
ãš
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"LaunchScreen" bundle:nil];
ããã§ã¢ããªãèµ·åããŸãããèæ¯ãé»ããªããŸãã
ãŸãã¯ãhttpsïŒ//github.com/crazycodeboy/react-native-splash-screenã䜿çšããããšãã§ããŸã:)
æãåèã«ãªãã³ã¡ã³ã
ããã«è¿œå ããã«ã¯...
ç§ãèŠã€ãã解決çã¯ã
rootView
ã«èæ¯è²ãå²ãåœãŠã[UIColor colorWithPatternImage:img]
ãããã¯ãå®å šã«ããŒãããããŸã§è¡šç€ºããããŸãŸã«ãªãããã«ããããã®é 延ãå¿ èŠãšããŸããã
ããã€ã¹ã«å¿ èŠãªLaunchImageãèŠã€ããå®å šãªã¹ããããïŒããã³@ dvine-multimediaãæäŸãããã³ãã䜿çšïŒã¯æ¬¡ã®ãšããã§ãã
LaunchImageã¯ãreact-nativeãã³ãã«ãå®å šã«ããŒãããããŸã§è¡šç€ºããããŸãŸã«ãªããŸãã