React-native: 【初期化】起動画面癜点滅

䜜成日 2015幎05月26日  Â·  138コメント  Â·  ゜ヌス: facebook/react-native

LaunchScreenに぀いお良い習慣があるかどうか疑問に思っおいたす。 私がこれを求めおいる理由は、LaunchScreenを远加するず、react-nativeが起動しおアプリをロヌドする前に癜いフラッシュが衚瀺されるためです。 これを防ぐ方法はありたすか

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-これは次のリリヌスで修正されたす //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;

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ものです。 どうしお芋逃したのかわからない。 申し蚳ありたせん。

ここで助けおくれおありがずう。 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でこれを修正する方法を芋぀けた人はいたすか

これは助けになりたすか

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

@ 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起動画像]を遞択したす。

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 = [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段階のスプラッシュスクリヌンが含たれたす。

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

私は同様の実装@mehcodeを持っおいたした-私はあなたがここに持っおいるものが奜きです。 RNむンスタンスマネヌゞャヌにアクセスする方法を探しおいたしたが、 getReactNativeHost()呌び出しがあったこずはわかりたせん

私は次のこずをしたしたそれに぀いおは満足しおいたせん

  1. SplashActivityはアプリが開いたずきに開始されたした
  2. MainActivityずfinish()すぐに開きたす
  3. 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が衚瀺される透明床があるためです。 ドロワヌオヌプントランゞション䞭に䜿甚しおいるドロワヌプラグむンでも同様の問題が発生したす。
だから私は次のようなこずをしたいず思いたす

  • ロヌドプロセス䞭に䞊蚘の@ dbonner1987のアプロヌチを䜿甚しお、rootViewの背景色をランチャヌ画像に蚭定したす。
  • javascriptの読み蟌みが完了し、最初のナビゲヌションルヌトが開始されたずきたたはそれらの線に沿った䜕か
  • rootViewの背景色を癜に戻したす。

したがっお、基本的に、ロヌドがい぀行われたかを知るためのコヌルバックが必芁です。

@ 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を䜿甚するこずもできたす:)

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡