React-native: [์ดˆ๊ธฐํ™”] ์‹คํ–‰ ํ™”๋ฉด ํฐ์ƒ‰ ํ”Œ๋ž˜์‹œ

์— ๋งŒ๋“  2015๋…„ 05์›” 26์ผ  ยท  138์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/react-native

LaunchScreen์— ๋Œ€ํ•œ ๋ชจ๋ฒ” ์‚ฌ๋ก€๊ฐ€ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ด๊ฒƒ์„ ๋ฌป๋Š” ์ด์œ ๋Š” LaunchScreen์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ๊ฐ€ ์‹œ์ž‘๋˜๊ณ  ์•ฑ์„ ๋กœ๋“œํ•˜๊ธฐ ์ „์— ํฐ์ƒ‰ ํ”Œ๋ž˜์‹œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

AsyncStorage Locked

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์—ฌ๊ธฐ์— ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด...

๋‚ด๊ฐ€ ์ฐพ์€ ํ•ด๊ฒฐ์ฑ…์€ 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 ๋ฒˆ๋“ค์ด ์™„์ „ํžˆ ๋กœ๋“œ๋  ๋•Œ๊นŒ์ง€ ๊ณ„์† ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  138 ๋Œ“๊ธ€

@alinz - ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. https://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 ์•ฑ์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ทน๋ณตํ•ฉ๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๋ฉด 100% React Native์ธ F8์ด ์‹œ์ž‘ ํ™”๋ฉด์—์„œ ์•ฑ์œผ๋กœ ์ง์ ‘ ์ „ํ™˜๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. cc @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๊ฐ€ ์„ค๋ช…ํ•œ ๊ฒƒ์— ๋Œ€ํ•œ ์‰ฌ์šด ํ•ด๊ฒฐ์ฑ…์€ iOS 8 ์ด์ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์‹คํ–‰ ํ™”๋ฉด xib๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ide ๋‚˜๋Š” launchscreen xib๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ์ž‘ ์‹œ lauchscreen ๋ณด๊ธฐ๊ฐ€ ํ‘œ์‹œ๋˜์ง€๋งŒ ์•ฑ์ด ๋ถ€ํŒ…๋˜๊ธฐ ์ „์— ํฐ์ƒ‰ ๋ณด๊ธฐ(ํ”Œ๋ž˜์‹œ)๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

@alinz , @ide ๋Š” launchscreen xib๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ RCTRootView loadingView๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(์—ฌ์ „ํžˆ ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•จ). (์•„์ง) ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ์ž๋™ ์ง€์›์€ ์—†์Šต๋‹ˆ๋‹ค.

๋ช…ํ™•ํžˆ ํ•˜์ž๋ฉด iOS๋Š” React๊ฐ€ ๋กœ๋”ฉ์„ _์‹œ์ž‘_ํ•˜๋Š” ์‹œ์ ์— ์‹œ์ž‘ ํ™”๋ฉด์„ ์ˆจ๊น๋‹ˆ๋‹ค. ๋นˆ ํ™”๋ฉด์ด ํ‘œ์‹œ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด RCTRootView์˜ loadingView์™€ ๋™์ผํ•œ ๋ณด๊ธฐ๋ฅผ ์ˆ˜๋™์œผ๋กœ ํ‘œ์‹œํ•˜์—ฌ ์‹œ์ž‘ ํ™”๋ฉด์ด ํ‘œ์‹œ๋˜๋Š” ์‹œ๊ฐ„์„ ์—ฐ์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@nicklockwood ์˜ ์„ค๋ช…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๋‚ด ์ž˜๋ชป์ด์—ˆ๋‹ค. :)

http://stackoverflow.com/a/29115477/255765์˜ Curtesy ๋‚˜๋Š” ์ด๊ฒƒ์œผ๋กœ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค.

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-multimedia๊ฐ€ ์œ„์—์„œ ์ œ๊ณตํ•œ ์ฝ”๋“œ ์กฐ๊ฐ๋ณด๋‹ค ๋” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

@myusuf3

@nicklockwood ์‹ค์ œ๋กœ ๊ทธ๋“ค์€ ๊ฑฐ์˜ ๊ฐ™์€ ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ด๊ฒƒ์„ ์กฐ์‚ฌํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ๋‚˜๋Š” xcode ๊ฒฝํ—˜์ด ์ „ํ˜€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์‹ ์˜ ์Šค๋‹ˆํ•‘์œผ๋กœ ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์นจ๋‚ด ๋‚ด๊ฐ€ ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ์ง€์ ์— ์ด๋ฅด๋ €์„ ๋•Œ, ๋‚˜๋Š” ๋‹น์‹ ์ด ์ด๋ฏธ ๊ฑฐ๊ธฐ์— ์žˆ์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์™ธ์—๋„ ๊ฐœ์ธ์ ์œผ๋กœ "๋‚ด"์†”๋ฃจ์…˜์ด ์กฐ๊ธˆ ๋” ์ฝ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ์ˆœ์ˆ˜ํ•œ ๋ฏธํ•™.

@nicklockwood ์ฝ”๋“œ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ํฐ์ƒ‰ ํ”Œ๋ž˜์‹œ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋กœ๋”ฉ ๋ทฐ๋กœ ์„ค์ •ํ•  ์‹œ์ž‘ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์‹œ์ž‘ ์ด๋ฏธ์ง€๋Š” launchScreen.xib์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์šฐ๋ฆฌ ์•ฑ์˜ ์ถœ์‹œ๋ฅผ ๋ณด๋ฅ˜ํ•˜๋Š” ์œ ์ผํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋„์›€์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ์ด๋ฏธ์ง€๋ฅผ ์ˆจ๊ธด ํ›„ ํ”Œ๋ž˜์‹œ๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ฑฐ๋‚˜ ์‹คํ–‰ ์ด๋ฏธ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? (์ด๊ฒƒ์€ ๊ทธ๋ƒฅ ๋ณด๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ๊ฒฐ์ •ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹คํ–‰ ์ด๋ฏธ์ง€๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ํ™•์‹คํ•œ ๋นจ๊ฐ„์ƒ‰ ์ง์‚ฌ๊ฐํ˜•๊ณผ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์‹ญ์‹œ์˜ค).

@nicklockwood xib ํŒŒ์ผ๊ณผ launchScreen Image ๊ฐ„์˜ ์ƒ‰์ƒ์„ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๊ทธ ํ”Œ๋ž˜์‹œ๋ฅผ ๋ณด๊ณ  ์žˆ์—ˆ๋‹ค.

๋‚ด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 UIImageView *launchView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"launchScreen1"]];
 rootView.loadingView = launchView;

 rootView.loadingViewFadeDelay = 0.0;
 rootView.loadingViewFadeDuration = 0.15;

์ด์ œ ๋งˆ์ง€๋ง‰ ๋‘ ์ค„ 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;

ํ™•์ธ. ๋” ๊นŠ์ด ํŒŒ๊ณ  ๋“ค๋ฉด ํ”Œ๋ž˜์‹œ๊ฐ€ asyncstore์—์„œ ๊ฐ’์„ ๋กœ๋“œํ•  ๋•Œ๊นŒ์ง€ ๋‚ด ์•ฑ์ด ์•„๋ฌด ๊ฒƒ๋„ ๋ Œ๋”๋งํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

render() {
  if(!this.state.loaded) return (null);
  return <View ...../>;
}

loadingView๋Š” js๊ฐ€ ๋ Œ๋”๋ง์„ ์™„๋ฃŒํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  loadingView๋ฅผ ์ˆจ๊น๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ js๋Š” return null ๋ Œ๋”๋ง์„ ๋งˆ์ณค์Šต๋‹ˆ๋‹ค.

@nicklockwood @alinz ๊ทธ๋ƒฅ ๊ณต์ค‘์—์„œ ์ดฌ์˜ ์ค‘์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ์ด์œ ๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์„ธ์š”?

๋˜ํ•œ ๋‚ด๊ฐ€ ์•Œ์•„์ฐจ๋ฆฐ ํ•œ ๊ฐ€์ง€๋Š” loadingViewFadeDelay ๋“ฑ์˜ ๊ฐ’์„ 0.30 ์ด์ƒ์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์ „ํ™˜์ด ๋งค์šฐ ๋งค๋„๋Ÿฝ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0.25๋กœ ๋ถ€๋“œ๋Ÿฝ์Šต๋‹ˆ๋‹ค.

loadingFadeDelay์˜ ๋ชฉ์ ์€ ์ •ํ™•ํžˆ ์•ฑ์ด ์•„๋ฌด ๊ฒƒ๋„ ์ฆ‰์‹œ ๋ Œ๋”๋งํ•˜์ง€ ์•Š๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ loadingViewFadeDelay๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋กœ๋“œํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๊ฒฝ์šฐ ์ง€์›ํ•˜๋Š” ๊ฐ€์žฅ ๋Š๋ฆฐ ์žฅ์น˜์—์„œ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@nicklockwood ์†”๋ฃจ์…˜์„ ์ข‹์•„ํ•˜์ง€๋งŒ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ๋„คํŠธ์›Œํฌ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์†”๋ฃจ์…˜์€ ๊ตฌ์„ฑ ์š”์†Œ ์ƒํƒœ๋ฅผ ์ผ์ข…์˜ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๊ตฌ์„ฑ ์š”์†Œ์— ์ผ์ข…์˜ ๋กœ๋“œ ๋Œ€ํ™” ์ƒ์ž๋ฅผ ํ‘œ์‹œํ•˜๋„๋ก ์ง€์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹œ์›ํ•œ. ๋‚˜๋Š” ํ•ด๊ฒฐ์ฑ…์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์„ธ ๊ฐ€์ง€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ชจ๋‘ ๋™์ผํ•œ ๊ฒƒ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

1) launchScreen.xib
2) loadingView
3) return null in render to actually render a view which is like loadingView and launchScreen.xib?

๊ทธ๋Ÿฌ๋‚˜ ํฌ์ธํŠธ 3์ด ๋‹ค๋ฅธ ์žฅ์น˜์—์„œ ์–ด๋–ป๊ฒŒ ํ™•์žฅ๋˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„๋„ ๊ทธ๋ ‡๊ฒŒ ์ œ์•ˆํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์‹œ์ž‘ ์‹œ๊ฐ„์ด ๋„คํŠธ์›Œํฌ ๋‹ค์Œ ํ…Œ์ŠคํŠธ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒฝ์šฐ ํŽ˜์ด๋“œ ์ง€์—ฐ๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ๋‹ค์šด๋กœ๋“œ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ๋Œ€์‹  "๋นˆ" ๋ณด๊ธฐ๋ฅผ ์ฆ‰์‹œ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์„ ์˜นํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ์—†์Œ

๋„คํŠธ์›Œํฌ์— ์˜์กดํ•˜๋“  ๊ทธ๋ ‡์ง€ ์•Š๋“  ์ €๋Š” ํƒ€์ž„๋ฒ ์ด์Šค ๋””์Šคํ”Œ๋ ˆ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณ„๋กœ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ค์ •ํ•œ ์‹œ๊ฐ„์ด ์ •ํ™•ํ•˜๋‹ค๊ณ  100% ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌด์–ธ๊ฐ€๊ฐ€ ์ผ์–ด๋‚˜๊ณ  ์žˆ์ง€๋งŒ ํ‘œ์‹œํ•  ์ค€๋น„๊ฐ€ ๋˜์ง€ ์•Š์•˜์Œ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ํ•ญ์ƒ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹จ์ง€ ์ œ์•ˆ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

๋™์˜. ํ‘œ์ค€ iOS ๋กœ๋”ฉ ์ด๋ฏธ์ง€์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ loadingView์˜ ๋ชฉ์ ์€ ์•ฑ์ด ํ‘œ์‹œํ•  ์ค€๋น„๊ฐ€ ๋œ ๋ชจ๋“  ๊ฒƒ์ด ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ์ธ ๊ฒฝ์šฐ์—๋„ ์•ฑ์ด ๋ฌด์–ธ๊ฐ€๋ฅผ ํ‘œ์‹œํ•  ์ค€๋น„๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๋ฎ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฆ‰, ์ด๋ฏธ์ง€ ๋Œ€์‹  ๋ทฐ๋กœ ๋งŒ๋“  ์ด์œ ๋Š” ์ •์ ์ด ์•„๋‹Œ ์ƒํƒœ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ฒฝ์šฐ loadingView์— UIActivityIndicatorView๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐœ์‚ฌ ์ด๋ฏธ์ง€๋Š” ์–ด๋–ป๊ฒŒ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ”„๋ ˆ์ž„ ์›์ ์„ ์กฐ์ •ํ•ด ๋ณด์•˜์ง€๋งŒ ์–ด๋–ค ์›์ ์„ ์‚ฌ์šฉํ•˜๋“  ํ•ญ์ƒ ์ค‘์•™์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ƒ๋‹จ์— ๋ฐฐ์น˜ํ•˜๊ณ  ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ป—์–ด์žˆ๋Š” ์ž‘์€ ์ƒ๋‹จ ๋ง‰๋Œ€ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ๊ฐ€์ง„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  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];
...

์‚ฌ์‹ค, ๋ž˜ํผ๋กœ ํ™”๋ฉด ๊ณต๊ฐ„์„ ์ฑ„์šฐ๊ณ  ์ด๋ฏธ์ง€๋ฅผ ๋งจ ์œ„์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ž˜ํผ๋Š” RootView์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ค‘์•™์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค .

@Intellicode ๋„ค.

@dvine-multimedia์˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ iphone 4s์—์„œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์•ฑ์„ ์ค‘๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์ •์€ if์— ํœด์‹์„ ๋„ฃ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

containsString ios 7์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฒˆ ๋” ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

@nicklockwood ๋กœ๋“œ ๋ทฐ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ตœ์ƒ์˜ ํ•ด์ƒ๋„๋ฅผ ์ž๋™์œผ๋กœ ์„ ํƒํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•˜์‹ญ๋‹ˆ๊นŒ?

loadingView๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ „ํ˜€ ์„ ํƒํ•˜์ง€ ์•Š๊ณ  ์ „๋‹ฌํ•œ ๋‚ด์šฉ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‹œ์ž‘ inage๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์œ„์— ๊ฒŒ์‹œํ•œ ์Šค๋‹ˆํŽซ์€ ์žฅ์น˜์— ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ํ•ด์ƒ๋„๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์Šค๋‹ˆํŽซ์€ ์˜ฌ๋ฐ”๋ฅธ ์น˜์ˆ˜๋ฅผ ๊ฐ€์ง„ ๊ฒƒ์„ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ์–ด๋–ค ์ˆ˜์ •?

๋‚ด ์†”๋ฃจ์…˜์ด๋‚˜ dvine์˜ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? ์–ด๋–ค iPhone ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์ดˆ์ƒํ™” ๋˜๋Š” ํ’๊ฒฝ?

dvine์„ ์‚ฌ์šฉํ•  ๋•Œ ์˜ฌ๋ฐ”๋ฅธ ์ฐจ์›์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ur ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฏธ์ง€ ์ฃผ์œ„์— ๊ฒ€์€ ๊ณต๊ฐ„์ด ์ƒ๊น๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฒ€์€ ๊ณต๊ฐ„์ด ์ž˜๋ชป๋œ ์น˜์ˆ˜๋กœ ์ด๋ฏธ์ง€๋ฅผ ์„ ํƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ์•„์ดํฐ 6์ž…๋‹ˆ๋‹ค. ์ดˆ์ƒํ™”์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€์ž…๋‹ˆ๋‹ค. ํฐ์ƒ‰ ๋ฐฐ๊ฒฝ์— ์ฃผ๋ชฉํ•˜์„ธ์š”.

๋‹ค์Œ ์ฝ”๋“œ ์‚ฌ์šฉ:

UIImageView *launchView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LaunchImage"]];
  rootView.loadingView = launchView;
  rootView.loadingViewFadeDelay = 0.20;
  rootView.loadingViewFadeDuration = 0.20;

lrn_launch_screen

๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ๊ฒŒ์‹œ ํ•œ ์†”๋ฃจ์…˜์ด ์•„๋‹ˆ ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

// 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 ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์–ด๋–ป๊ฒŒ ๋†“์ณค๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฏธ์•ˆ ๋‚ด ์‹ค์ˆ˜.

๋„์›€์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ฒ„์ „์—์„œ ์ด ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ์ปค๋ฒ„ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ’๊ฒฝ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆํ•˜ ๋‚˜๋Š” ์•„๋งˆ๋„ "์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ ํ”„๋กœ๋•์…˜์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๊ณ , ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ–ˆ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค :-)

"์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ ํ”„๋กœ๋•์…˜์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค"๋Š” ์•ฑ ์Šคํ† ์–ด์—์„œ ๋ณ„ 1๊ฐœ๋กœ๋ถ€ํ„ฐ ์šฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด ์ฃผ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ใ…‹. ๊ฑฑ์ • ๋งˆ. ์„ธ์ƒ์„ ๊ตฌํ•  ์ƒˆ๋กœ์šด ๋ฒ„์ „์ด ํ•ญ์ƒ ์žˆ์Šต๋‹ˆ๋‹ค. :)

์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ๋…ผ์˜๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ํ‹ฐ์ผ“์„ ๋‹ซ๊ณ  ๋ช‡ ๊ฐ€์ง€ ์ข‹์€ ์†”๋ฃจ์…˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

LaunchScreen xib๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์ด๊ฒƒ์„ 100% ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์€ ํ•ด๋‹น ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

UIView* launchScreenView = [[[NSBundle mainBundle] loadNibNamed:@"LaunchScreen" owner:self options:nil] objectAtIndex:0];
launchScreenView.frame = self.window.bounds;
rootView.loadingView = launchScreenView;

return YES ๋ผ๊ณ  ํ‘œ์‹œ๋œ ์ค„ ๋ฐ”๋กœ ์œ„์— ์žˆ๋Š” AppDelegate.m ํŒŒ์ผ์˜ application didFinishLaunchingWithOptions ๋ฉ”์„œ๋“œ์— ํ•ด๋‹น ์ค„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

@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 ํŒŒ์ผ์˜ return YES ์ค„ ์œ„์— ์žˆ๋Š” application didFinishLaunchingWithOptions ๋ฉ”์„œ๋“œ์— ๋‹ค์Œ ์ค„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์ด ํ•œ. 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์˜ ๊ตฌ์„ฑ ์˜ค๋ฅ˜์ž…๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด iOS 9์˜ ๋ฒ„๊ทธ์ผ๊นŒ์š”?

์žฅ์น˜์—์„œ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ๋งŒ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๊นŒ?

@nicklockwood ๊ฐ์‚ฌ

์•ˆ๋…•ํ•˜์„ธ์š” @genexliu๋‹˜ , ์ด๋ฏธ์ง€์˜ "LaunchImage" ์„ธํŠธ๋ฅผ Images.xcassets/LaunchImage.launchimage/ ํ–ˆ์ง€๋งŒ ๋ถ™์—ฌ๋„ฃ์€ ์ฝ”๋“œ์™€ LaunchScreen.storyboard ๋ชจ๋‘ ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ์ฐพ๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(๋‘˜ ๋‹ค ์ž๋™์œผ๋กœ ์‹คํŒจํ•จ). ๋‚ด LaunchScreen ์Šคํ† ๋ฆฌ๋ณด๋“œ๋Š” ๋ฐฐ๊ฒฝ์ƒ‰์„ ๋ณผ ๋•Œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋กœ๋“œ๋˜์ง€๋งŒ ์ฐธ์กฐ๋œ ์ด๋ฏธ์ง€๋Š” ํ‘œ์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์•„์ด๋””์–ด?

๋˜ํ•œ XCode์—์„œ ์‹คํ–‰ํ•  ๋•Œ์˜ ์‹œ์ž‘ ์ˆœ์„œ๋Š” ์ •์ƒ์ ์œผ๋กœ ๋ณด์ด์ง€๋งŒ cmd ํ–‰์—์„œ natal launch ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์‹œ์ž‘ ์ˆœ์„œ/์ถ”๊ฐ€ ํฐ์ƒ‰ ํ”Œ๋ž˜์‹œ ๋“ฑ์˜ ์ถ”๊ฐ€ ์‹คํ–‰์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

LaunchImage๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋Š” Storyboard์˜ ๋ฌธ์ œ๋Š” ๋ถ„๋ช…ํžˆ XCode์˜ ๋ฒ„๊ทธ์˜€์Šต๋‹ˆ๋‹ค. ์‹œ์ž‘ ์„ค์ •์„ '์ž์‚ฐ ์นดํƒˆ๋กœ๊ทธ ์‚ฌ์šฉ'์œผ๋กœ ๋ณ€๊ฒฝํ•œ ๋‹ค์Œ ๋‹ค์‹œ '์Šคํ† ๋ฆฌ๋ณด๋“œ ์‚ฌ์šฉ'์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์ž‘๋™์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. @genexliu ์˜ ์ฝ”๋“œ๊ฐ€ ์ €์—๊ฒŒ ํšจ๊ณผ๊ฐ€ ์žˆ๋Š”์ง€ loadingViewFadeDelay ํšจ๊ณผ๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚ด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  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"์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ค, ์˜ˆ. ๋„ค๊ฐ€ ์˜ณ์•„. ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ์‹œ๋„ํ•œ ์ˆœ์—ด ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค(์ฒซ ๋ฒˆ์งธ๋Š” ์•„๋‹˜).

๋˜ํ•œ 3๊ฐœ์›” ์ „ ์œ„์˜ ๋‚ด ๋Œ“๊ธ€์—์„œ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๋‹ค๋ฅธ ์žฅ์น˜ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๋งŽ์€ ์‹œ์ž‘ ์ด๋ฏธ์ง€ ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋„! ๋‹น์‹ ์ด ์˜ณ์•˜. LaunchImage ๋‹ค์‹œ ์ „ํ™˜ํ•˜๋ฉด ์ด์ œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ณ ๋งˆ์›Œ!

๋ˆ„๊ตฌ๋“ ์ง€ Android์— ๋Œ€ํ•œ ์ด๊ฒƒ์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์•ˆ๋“œ๋กœ์ด๋“œ์šฉ +1

cc @dmmiller Android์— loadingView ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” ์ด์™€ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ๊ฒŒ์‹œ๋œ ์†”๋ฃจ์…˜์ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณด์•˜์ง€๋งŒ ์ด ์ฝ”๋“œ๋ฅผ ์–ด๋””์— ๋„ฃ์–ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ํ•ด๊ฒฐ์ฑ…์€ React Native ์ž์ฒด ๋‚ด์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Objective-C ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ? ์ด ๊ฒฝ์šฐ ๊ฒŒ์‹œ๋œ ์ฝ”๋“œ๋Š” ์–ด๋””๋กœ ๊ฐ€๋‚˜์š”? 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-์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‚˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ˜์‘ ํ…Œ์ŠคํŠธ๋ฅผ ์‹œ์ž‘ํ•œ ์ดํ›„๋กœ ์ด๊ฒƒ์„ ๋‹ค๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ‘

@david-a, @geriux : ๋‚ด LaunchScreen.xib์— AspectFill ์ฝ˜ํ…์ธ  ๋ชจ๋“œ๊ฐ€ ์žˆ๋Š” ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๊ณ  ํฌ๊ธฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์กฐ์ •๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— launchScreenView.frame = CGRectZero; ๋„ ์„ค์ •ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๋ฒˆ์˜ ์‹œํ–‰ ์ฐฉ์˜ค ๋์— ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜์ง€๋งŒ ์›์ธ์ด ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@BasitAli ์˜ˆ, ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋” ์ž˜ ๋ฌธ์„œํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณด๊ธฐ์˜ ํฌ๊ธฐ๋ฅผ 0์ด ์•„๋‹Œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ํ™”๋ฉด ์ค‘์•™์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ํ™”๋ฉด์— ๋งž๊ฒŒ ํฌ๊ธฐ๊ฐ€ ์กฐ์ •๋ฉ๋‹ˆ๋‹ค.

@david-์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๊ท€ํ•˜์˜ ์˜๊ฒฌ์€ ์ƒ์šฉ๊ตฌ์— ํฌํ•จ๋˜๊ฑฐ๋‚˜ ์ตœ์†Œํ•œ ๊ธฐ๋ณธ ๋ฐ˜์‘ ๊ธฐ๋ณธ ๋ฌธ์„œ์˜ ์ผ๋ถ€์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ 2015๋…„ 3์›”์— ์ข…๋ฃŒ๋œ ์ด์œ ๊ฐ€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ 2016๋…„ 2์›”์˜ RN 0.20์— ์—ฌ์ „ํžˆ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ฌธ์„œ์— ๋Œ€ํ•œ PR์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์˜ ์กฐ์–ธ์€ ์ €์—๊ฒŒ ๋งŽ์€ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค(IOS์—์„œ๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•จ). Android์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋„์›€์ด ๋ ๊นŒ์š”?

https://github.com/remobile/react-native-splashscreen

@weiyisheng , iOS์—์„œ ์œ„์—์„œ ์„ค๋ช…ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ๊ณผ ํ•จ๊ป˜ Android์—์„œ @braco๊ฐ€ ์ œ์•ˆํ•œ ๋Œ€๋กœ react-native-splashscreen์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@braco @BasitAli ์˜ˆ, ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ ์•ฑ์—์„œ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ข‹์€ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ๊ณ ๋งˆ์›Œ์š”.

@BasitAli ํ˜ธ๊ธฐ์‹ฌ์— iOS์—์„œ ์‚ฌ์šฉํ•˜์ง€

๋‚ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์‹œ์ž‘ ํ™”๋ฉด์—์„œ ๋กœ๊ทธ์ธ ํ™”๋ฉด์œผ๋กœ ๋งค๋„๋Ÿฝ๊ฒŒ ์• ๋‹ˆ๋ฉ”์ด์…˜๋ฉ๋‹ˆ๋‹ค(๋กœ๊ณ ๊ฐ€ ์œ„๋กœ ์ด๋™ํ•˜๊ณ  ๋กœ๊ทธ์ธ ํ•„๋“œ๊ฐ€ ํŠ€์–ด๋‚˜์˜ด). rn-splashscreen ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํŽ˜์ด๋“œ ์•„์›ƒ๋˜์–ด ๋‚ด ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ์ž˜ ์–ด์šธ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— Android์—์„œ ์‚ฌ์šฉํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค.

@BasitAli react-native-splashscreen ํ”Œ๋Ÿฌ๊ทธ์ธ์€ rootView.loadingViewFadeDuration ์„ค์ •์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‹จ, ์—ฐ๊ฒฐ ํ›„ ์„ค์ •ํ–ˆ๋‹ค๋ฉด ํŽ˜์ด๋“œ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[RCTSplashScreen show:rootView];
rootView.loadingViewFadeDuration = 0;

"๋ฏธ๋ฆฌ ๋ฒˆ๋“ค๋œ ํŒŒ์ผ์—์„œ ๋กœ๋“œ ์ค‘"์ด๋ผ๋Š” ์ƒ๋‹จ์˜ ์ž‘์€ ๋ฉ”์‹œ์ง€๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@rclai ๋Š” ๋ฆด๋ฆฌ์Šคํ•  ๊ณ„ํš์„ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์•„! ๊ฐ์‚ฌ ํ•ด์š”!

๋‘ ํ”Œ๋žซํผ ์Šคํ”Œ๋ž˜์‹œ ํ™”๋ฉด์— ๋Œ€ํ•œ ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‘ ํ”Œ๋žซํผ ๋ชจ๋‘ ๋‚ด๋ถ€ ํŒŒ์ผ์„ ์ž…๋ ฅํ•˜๋ฉด ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ๋‹ต๋ณ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”

@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 ์‹œ์ž‘ ์ด๋ฏธ์ง€"๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

screen shot 2016-03-15 at 13 47 48

@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 = [UIColor blackColor]๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. 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 @hasen6 ์•„, ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. loadingView์˜ ํฌ๊ธฐ๊ฐ€ 0์ธ ๊ฒฝ์šฐ ํ™”๋ฉด์— ๋งž๊ฒŒ ์ž๋™์œผ๋กœ ํฌ๊ธฐ๊ฐ€ ์กฐ์ •๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ž˜๋ชป ๊ธฐ์–ตํ–ˆ์ง€๋งŒ ๋ถ„๋ช…ํžˆ ๊ทธ๋ ‡์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@hasen6 ์—ฌ๊ธฐ์— ์ž‘๋™ํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ์˜ ์ˆ˜์ •๋œ ๋ฒ„์ „์ด ์žˆ์Šต๋‹ˆ๋‹ค(xib ์†”๋ฃจ์…˜๋„ ๊ดœ์ฐฎ์ง€๋งŒ ๊ฒ€์€์ƒ‰ ํ™”๋ฉด๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ค‘๋ณต๋จ).

rootView.loadingView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
rootView.loadingView.backgroundColor = [UIColor blackColor];
rootView.loadingViewFadeDelay = 0.5; // measured in seconds

์ฐธ๊ณ : 1์€ loadingViewFadeDelay์— ๋Œ€ํ•ด ์ƒ๋‹นํžˆ ํฐ ๊ฐ’์ž…๋‹ˆ๋‹ค. ์•ฑ์ด ์‹œ์ž‘๋˜๊ธฐ ์ „์— ์‚ฌ์šฉ์ž๊ฐ€ ์ถ”๊ฐ€๋กœ 1์ดˆ๋ฅผ โ€‹โ€‹๊ธฐ๋‹ค๋ ค์•ผ ํ•จ์„ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ฒ—์–ด๋‚  ์ˆ˜์žˆ๋Š” ๊ฐ€์žฅ ๋‚ฎ์€ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค (0.25๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์ด๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ์•ฑ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค).

์˜ˆ, 1์ด ์กฐ๊ธˆ ๊ธธ์—ˆ๊ณ  ๋‚ด ์•ฑ ์ค‘ ํ•˜๋‚˜์—์„œ ์‹œ์ž‘ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” 0.1๋„ ๊ดœ์ฐฎ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๋‹ค. ๋‹น์‹ ์˜ ๋„์›€์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@hasen6์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ฆ‰์‹œ Objective-C( AppDelegate.m )์— ๋›ฐ์–ด๋“ค์–ด React Native ์•ฑ์„ ์ƒ์„ฑํ•˜๋Š” ์ฆ‰์‹œ ์ผ๋ถ€ ์ฝ”๋“œ๋ฅผ ์กฐ์ •ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ์กฐ๊ธˆ ์ด์ƒํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. React Native๊ฐ€ ์ด ์ˆ˜์ • ์‚ฌํ•ญ์ด ์ด๋ฏธ ์ ์šฉ๋œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‚˜์š”? ์•„๋‹ˆ๋ฉด JavaScript(๋˜๋Š” ์„ ์–ธ์  ๊ตฌ์„ฑ ์–ธ์–ด)์—์„œ ์‹œ์ž‘ ํ™”๋ฉด ๊ตฌ์„ฑ์„ ์œ„ํ•œ ๋ณด๋‹ค ์ถ”์ƒ์ ์ธ ์†”๋ฃจ์…˜์„ ๋„์ž…ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@johanatan ์•„์ด๋Ÿฌ๋‹ˆํ•˜๊ฒŒ๋„ React Native์˜ ๊ฐ€์žฅ ํฌ๊ณ  ์˜ค๋ž˜ ์ง€์†๋˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๋Š” ์ผ์ข…์˜ ํฐ์ƒ‰ ํ”Œ๋ž˜์‹œ์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜์™€ ์ด๋ฏธ์ง€์— ํฐ์ƒ‰์ด ๊นœ๋ฐ•์ž…๋‹ˆ๋‹ค.

๋‚ด LaunchScreen xib๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋” ์ปค์ง€๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌด์—‡์ด ๋” ํฐ ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

UIView *loading = [[[NSBundle mainBundle] loadNibNamed:@"LaunchScreen" owner:self options:nil ] ๊ฐœ์ฒด 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

์•ˆ๋“œ๋กœ์ด๋“œ ์†”๋ฃจ์…˜์€ ๊ทธ๊ฒƒ์„ ์•Œ์•„๋‚ด๋Š” ๋ฐ ์–ผ๋งˆ๋‚˜ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋Š”์ง€ ๋‚˜ ์ž์‹ ์—๊ฒŒ ์งœ์ฆ์ด ๋‚  ์ •๋„๋กœ ์–ด๋ฆฌ์„๊ฒŒ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

3๋‹จ๊ณ„ ์Šคํ”Œ๋ž˜์‹œ ํ™”๋ฉด์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

https://github.com/mehcode/rn-splash-screen/issues/1

๋น„์Šทํ•œ ๊ตฌํ˜„ @mehcode ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์— ์žˆ๋Š” ๊ฒƒ์ด ๋งˆ์Œ์— getReactNativeHost() ํ˜ธ์ถœ์ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์•Œ๊ฒŒ ๋˜์–ด์„œ ๋งค์šฐ ์ข‹์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค (๋งŒ์กฑํ•˜์ง€ ์•Š์Œ)

  1. SplashActivity ์•ฑ์ด ์—ด๋ฆด ๋•Œ ์‹œ์ž‘๋จ
  2. MainActivity ๋ฐ finish() ์ฆ‰์‹œ ์—ด๊ธฐ
  3. MainActivity ๋Š” MainActivity ์œ„์— ์Šคํ”Œ๋ž˜์‹œ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์‹œ์ž‘ํ•˜์ž๋งˆ์ž "์ „๊ฒฝ ๋ชจ๋“œ"์ž„์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ”Œ๋ž˜๊ทธ๋กœ SplashActivity ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ž ์‹œ ํ›„ SplashActivity ๊ฐ€ ๋‹ซํžˆ๊ณ  ์•ฑ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

@ajwhite

๊ฐ์‚ฌ ํ•ด์š”. ํšจ๊ณผ๋Š” ๋งค์šฐ ๋ถ€๋“œ๋Ÿฝ์Šต๋‹ˆ๋‹ค.

๋‚ด ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ ๋‚˜๋Š” ๋ง ๊ทธ๋Œ€๋กœ ReactActivity ๋ฅผ ๋‚ด ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋ณต์‚ฌํ–ˆ๊ณ  mReactInstanceMangager ๋ฅผ private ๋Œ€์‹  protected๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

react-native 0.29(๋Œ“๊ธ€์—์„œ ๋งํ–ˆ์–ด์•ผ ํ•จ)์—์„œ react-native ํŒ€์€ ์šฐ๋ฆฌ์—๊ฒŒ ๊ณต๊ฐœ ๋ฉ”์†Œ๋“œ getReactNativeHost() ๋ฅผ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

ReactNativeHost ์ปจํ…Œ์ด๋„ˆ๋Š” ํ›Œ๋ฅญํ•œ ์›€์ง์ž„์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ๋‚ด๊ฐ€ ๊ฒช์€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. MainActivity์—์„œ ์ˆ˜๋ช… ์ฃผ๊ธฐ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ด€์‹ฌ ์ฐธ์กฐ: https://github.com/facebook/react-native/commit/49f20f41546e3ba8e7fe43c84c4c701684d0434d#diff -1346852de0c7f8466a36d42de50ec808R2

์—ฌ๊ธฐ์— ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด...

๋‚ด๊ฐ€ ์ฐพ์€ ํ•ด๊ฒฐ์ฑ…์€ 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์— ๋Œ€ํ•ด ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ํ™”๋ฉด์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

@arnemart ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ RN 0.30.0์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์„ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ ์„ค์น˜ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ํฐ์ƒ‰ ํ”Œ๋ž˜์‹œ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ๊ทธ ์ดํ›„์—๋Š” ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

@nicklockwood ์‹ค์ œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ์‹œ๊ธฐ๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ข…์˜ ์ฝœ๋ฐฑ์ด
๊ทธ๋ž˜์„œ ์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  • ๋กœ๋“œ ๊ณผ์ •์—์„œ ์œ„์˜ @dbonner1987 ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ rootView ๋ฐฐ๊ฒฝ์ƒ‰์„ ๋Ÿฐ์ฒ˜ ์ด๋ฏธ์ง€๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋กœ๋“œ๋ฅผ ์™„๋ฃŒํ•˜๊ณ  ์ฒซ ๋ฒˆ์งธ ํƒ์ƒ‰ ๊ฒฝ๋กœ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ(๋˜๋Š” ํ•ด๋‹น ๋ผ์ธ์„ ๋”ฐ๋ผ ๋ฌด์–ธ๊ฐ€)
  • rootView ๋ฐฐ๊ฒฝ์ƒ‰์„ ๋‹ค์‹œ ํฐ์ƒ‰์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋กœ๋”ฉ์ด ์™„๋ฃŒ๋˜๋ฉด ์ฝœ๋ฐฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@UKDeveloper99 ์ œ๊ฐ€ ์œ„์— ๋ช‡ ๋ฒˆ ๋งํฌํ•œ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝœ๋ฐฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/mehcode/rn-splash-screen/blob/master/docs/android.md

@mehcode ์™„์ „ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!!

๋ฒˆ๋“ค์ด ๋กœ๋“œ๋˜๋ฉด ๊บผ์ง€๋Š” LaunchScreen.storyboard ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ œ์•ˆ์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ํ˜„์žฌ ๊ณ ์ •๋œ ์‹œ๊ฐ„ ๋™์•ˆ ํ‘œ์‹œ๋˜๊ณ  ํฐ์ƒ‰ ํ™”๋ฉด์ด ํ‘œ์‹œ๋œ ๋‹ค์Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด RN 34.1 xcode 8์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

@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://github.com/mehcode/rn-splash-screen .
๋‚ด app.tsx(์ง„์ž…์ )์˜ ๋ Œ๋”๋ง ๊ธฐ๋Šฅ์—์„œ ์Šคํ”Œ๋ž˜์‹œ ํ™”๋ฉด์„ ์ˆจ๊ธฐ๊ณ  ๋‚ด ๋ชจ๋“  https ์š”์ฒญ์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋™์ผํ•œ ์ด๋ฏธ์ง€๋ฅผ ํ‘œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ฝ”๋“œ:
```
๊ณต๊ฐœ ๋ Œ๋”๋ง()
{
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์šฉ ๊ธฐ๋ณธ ๋ฐ˜์‘์—์„œ ๊ทธ์— ๋”ฐ๋ผ 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 native v0.51.0_์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋“œ๋กœ์ด๋“œ๋Š” ์•„์ง ์†”๋ฃจ์…˜์ด ์—†๋‚˜์š”?

@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์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค :)

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰