React-native: [Initialisierung] Startbildschirm weißer Blitz

Erstellt am 26. Mai 2015  ·  138Kommentare  ·  Quelle: facebook/react-native

Ich frage mich nur, ob es eine gute Vorgehensweise bei LaunchScreen gibt. Der Grund, warum ich dies frage, ist, dass wenn man LaunchScreen hinzufügt, ein weißer Blitz zu sehen ist, bevor Reactive-Native einsetzt und die App lädt. Gibt es eine Möglichkeit, dies zu verhindern?

AsyncStorage Locked

Hilfreichster Kommentar

Um dies zu ergänzen...

Eine Lösung, die ich gefunden habe, bestand darin, rootView eine Hintergrundfarbe zuzuweisen, aber [UIColor colorWithPatternImage:img] .

Dies erfordert keine Verzögerungen, um sicherzustellen, dass es bis zum vollständigen Laden sichtbar bleibt.

Ein vollständiges Snippet (und mit dem von @dvine-multimedia bereitgestellten Tipp), das das gewünschte LaunchImage für das Gerät findet, ist unten:

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

Das LaunchImage bleibt nun sichtbar, bis das reaktive Bundle vollständig geladen ist.

Alle 138 Kommentare

@liubko Ja, genau das möchte ich loswerden. Ich habe den Patch noch nicht angewendet, aber ich werde es heute Abend tun.

@brentvatne : Ich sehe nicht, wie dieser Patch dieses Problem beheben würde (wenn ich blind / dumm bin, bitte verzeihen Sie :-). Das Problem ist, dass zwischen dem Start der App und dem Betrieb von React ein Moment vergeht. Idealerweise würde der LaunchScreen angezeigt, bis React fertig und vollständig gerendert ist, wie es in einer "vollständig nativen" App der Fall ist.

@oblador - ah, dies würde es Ihnen ermöglichen, reibungsloser zu

@vjeux - wie @nicklockwood

Es gibt auch eine (separate) Lösung für dieses Problem. Verwenden Sie die neue Eigenschaft loadingView von RCTRootView und stellen Sie sie auf einen Vollbildmodus von UIImageView , der Ihr Startbild zeigt. Der Code könnte etwa so aussehen:

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

Ich habe mit einer Möglichkeit experimentiert, das Startbild automatisch zu erkennen und dies vollständig automatisch zu machen, aber es ist noch nicht wirklich fertig. Bei Interesse sieht es so aus:

// 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;
}

Eine einfache Lösung für das, was @nicklockwood beschrieben hat, besteht darin, den Startbildschirm xib zu laden, wenn Sie iOS 8+ verwenden.

@ide Ich verwende Launchscreen xib. Ich sehe meine Startbildschirmansicht zum Startzeitpunkt, aber bevor meine App hochfährt, sehe ich eine weiße Ansicht (Flash).

@alinz , ich glaube, @ide bedeutet, dass Sie Ihren Launchscreen-xib verwenden, um RCTRootView loadingView einzustellen (was Sie immer noch manuell tun müssen). Dafür gibt es (noch) keine automatische Unterstützung.

Zur Verdeutlichung blendet iOS Ihren Startbildschirm an dem Punkt aus, an dem React _beginnt_ zu laden. Um zu vermeiden, dass ein leerer Bildschirm angezeigt wird, müssen Sie die Anzeige des Startbildschirms verlängern, indem Sie manuell dieselbe Ansicht wie die loadingView von RCTRootView anzeigen.

Danke @nicklockwood für die Klarstellung. Das war mein Übel. :)

Mit freundlicher Genehmigung von http://stackoverflow.com/a/29115477/255765 landete ich bei diesem:

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;
      }
    }
  }

Scheint zu funktionieren.

+1 für einen standardisierten/dokumentierten Weg.

@dvine-multimedia funktioniert das besser als das Code-Snippet, das ich oben bereitgestellt habe?

@ myusuf3

@nicklockwood Eigentlich machen sie ziemlich dasselbe. Als ich anfing, mich damit zu befassen, wusste ich wahrscheinlich nicht, was ich mit Ihrem Schnipsel anfangen sollte, weil ich keine xcode-Erfahrung hatte. Als ich schließlich an dem Punkt ankam, an dem ich verstand, was zu tun war, wusste ich nicht, dass du schon dort gewesen warst. Außerdem finde ich persönlich "meine" Lösung etwas lesbarer. Aber diese reine Ästhetik.

@nicklockwood Ich habe deinen Code ausprobiert, aber ich sehe immer noch einen weißen Blitz. Ich habe ein Startbild erstellt, um es als Ladeansicht festzulegen. Startbild ist das gleiche wie launchScreen.xib.

Dies ist das einzige, was die Veröffentlichung unserer App hält. Bin wirklich für jede Hilfe dankbar.

Wird der Blitz angezeigt, nachdem das Startbild ausgeblendet wurde, oder wird das Startbild nicht angezeigt? (Dies kann nur durch Anschauen schwer zu bestimmen sein - ändern Sie das Startbild vorübergehend in ein durchgezogenes rotes Rechteck, um sicher zu gehen).

@nicklockwood Ich habe versucht, die Farbe zwischen der xib-Datei und dem LaunchScreen-Bild zu ändern. Ich sah diesen Blitz immer noch.

Mein Code sieht so aus:

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

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

Ich habe jetzt die letzten beiden Zeilen loadingViewFadeDelay und Duration entfernt und es scheint, dass das Problem gelöst ist. Ich sehe keinen Blitz. Schöner sanfter Übergang.

@chirag04 Ich habe es gerade mit einem Beispielprojekt versucht und den Flash nicht gesehen:(

das habe ich gemacht

  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;

In Ordnung. Wenn man tiefer gräbt, scheint es, als ob der Blitz vielleicht weil meine App nichts rendert, bis ein Wert von asyncstore geladen wird.

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

Ich denke, das loadingView denkt, dass das js das Rendern abgeschlossen hat und blendet das loadingView aus. js hat jedoch gerade das Rendering mit diesem return null

@nicklockwood @alinz Ich

Eine Sache, die mir auch aufgefallen ist, ist, dass der Übergang sehr, sehr glatt ist, wenn ich diese loadingViewFadeDelay etc.-Werte auf 0,30 oder höher setze. die Standardeinstellungen sind 0,25, was ebenfalls glatt ist.

Der Zweck von loadingFadeDelay besteht genau darin, das Szenario abzudecken, in dem Ihre App nicht sofort etwas rendert, sodass Sie sie richtig verwenden.

Sie sollten jedoch in Erwägung ziehen, loadingViewFadeDelay explizit festzulegen, falls sich die Standardeinstellung jemals ändert - und stellen Sie sicher, dass Sie auf dem langsamsten Gerät testen, das Sie unterstützen, falls das Laden länger dauert.

Ich mag die @nicklockwood- Lösung, aber Sie müssen die Netzwerklatenz berücksichtigen, die nicht vorhergesagt werden kann.

Eine andere Lösung besteht darin, den Komponentenstatus auf einen Standardwert zu setzen, um Ihre Komponente anzuweisen, eine Art Ladedialog anzuzeigen.

Cool. Ich glaube, ich habe die Lösung.

Was halten Sie davon, dass 3 Komponenten alle gleich sind.

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

Ich bin mir jedoch nicht sicher, wie Punkt 3 auf verschiedenen Geräten skaliert wird. Würden Sie das überhaupt vorschlagen?

Wenn die Startzeit vom Netzwerk abhängt, würde ich auf jeden Fall empfehlen, sofort eine "leere" Ansicht zu zeichnen, anstatt zu hoffen, dass sie schneller heruntergeladen wird als die Fade-Verzögerung.

hängt von asyncstorage ab. kein Netzwerk

Unabhängig davon, ob Sie vom Netzwerk abhängig sind oder nicht, ich mag die Zeitbasisanzeige nicht wirklich. Es gibt keine Möglichkeit, zu 100 % zu garantieren, dass die von Ihnen eingestellte Zeit korrekt ist. Sie sollten dem Benutzer immer etwas anzeigen, um anzuzeigen, dass etwas passiert, aber nicht zur Anzeige bereit ist. Dies ist nur ein Vorschlag.

Einverstanden. Der Zweck von loadingView besteht wie beim standardmäßigen iOS-Ladebild darin, nur abzudecken, bis Ihre App bereit ist, etwas anzuzeigen, auch wenn die App nur ein Lade-Spinner ist.

Das heißt, der Grund, warum ich es zu einer Ansicht anstelle eines Bildes gemacht habe, ist, dass Sie es nicht statisch machen können. Sie können der loadingView eine UIActivityIndicatorView hinzufügen, wenn Sie möchten.

Wie kann das Startbild positioniert werden? Ich habe versucht, den Rahmenursprung anzupassen, aber er positioniert ihn immer in der Mitte, egal welchen Ursprung ich verwendet habe. Ich habe ein kleines oberes Balkenbild, das ich oben positionieren und von links nach rechts strecken möchte.

Das habe ich:

  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;

Es handelt sich nicht um ein Startbild, sondern um ein Start-_view_, sodass Sie Ihre imageView in einer anderen Containeransicht positionieren und den Container als Startansicht verwenden können:

UIView *launchView = [[UIView alloc] init];
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LaunchImage"]];
imageView.frame = CGRectMake(whatever);
[launchView addSubview:imageView];
...

Es stimmt, ich denke, ich könnte den Wrapper den Bildschirmbereich ausfüllen und das Bild oben positionieren. Der Wrapper wird vom RootView anscheinend automatisch in der Mitte positioniert https://github.com/facebook/react-native/blob/757d6d204ae2d743634af64e3f78a4aad9d53f70/React/Base/RCTRootView.m#L191.

@Intellicode ja.

Habe gerade meine App in der Produktion auf dem iPhone 4s mit dem Code von @dvine-multimedia kaputt gemacht. Fix ist, einfach eine Pause in das if einzufügen.

Ein weiterer Absturz, weil containsString unter iOS 7 nicht verfügbar ist.

@nicklockwood Sie fragen sich, ob beim Laden der Ansicht automatisch die bestmögliche Auflösung ausgewählt wird?

loadingView wählt überhaupt kein Bild aus, es verwendet nur das, was Sie übergeben. Das oben gepostete Snippet zum Auffinden des Startbilds wählt jedoch die richtige Auflösung für das Gerät aus.

Ihr Snippet wählt jedoch nicht das mit den richtigen Abmessungen aus. irgendeine Lösung dafür?

Hast du meine Lösung oder die von dvine verwendet? Welches iPhone-Modell verwendest du? Hochformat oder Querformat?

bei Verwendung von dvine nimmt es die richtige Dimension auf. Mit Ihrer Lösung hat es schwarzen Raum um das Bild herum. Ich gehe davon aus, dass der schwarze Raum so ist, dass er das Bild mit der falschen Dimension aufnimmt.

Ich bin auf dem iPhone 6. Porträt.

So sieht es aus. Beachten Sie den weißen Hintergrund.

Verwenden des folgenden Codes:

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

lrn_launch_screen

Das war nicht die Lösung, die ich gepostet habe, dies war:

// 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;
}

Verdammt! Ich wünschte, ich würde deinen Kommentar aufmerksam lesen. Ihre Lösung funktioniert und ist auch leicht zu verstehen.

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:

Vielleicht ist es das experimenting Ding. Ich bin mir nicht sicher, wie ich es vermisst habe. Es tut mir leid.

Danke für die Hilfe hier. Werde diesen Code auf jeden Fall in der nächsten Version verwenden. Scheint auch alle Fälle abzudecken. Brauche keine Landschaft.

Heh, ich glaube, ich habe es unterboten. Ich hätte wahrscheinlich nur sagen sollen "Das ist es, was wir gerade in der Produktion verwenden und es scheint gut zu funktionieren" :-)

"Das ist es, was wir gerade in der Produktion verwenden" hätte uns vor einigen 1-Stern im App Store bewahrt. Haha. Keine Bange. Es gibt immer eine neue Version, um die Welt zu retten. :)

Diese Ausgabe übrigens schließen?

Ich werde dieses Ticket schließen, da es ausführlich und ausführlich besprochen wurde. Wir haben einige gute Lösungen.

Um dies für diejenigen, die ein LaunchScreen-xib verwenden, zu 100% klar zu machen, ist hier der Code, der dies funktioniert:

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

Fügen Sie diese Zeilen der Methode application didFinishLaunchingWithOptions in der Datei AppDelegate.m , direkt über der Zeile return YES .

@arnemart um klarer zu sein, dass die Methode nur für ios 8+ funktioniert, oder?

@arnemart Danke! Funktioniert einwandfrei .

Für diejenigen, die ein LaunchImage , müssen Sie sowohl frame als auch contentMode einstellen, damit das Bild richtig skaliert:

UIImageView *launchScreenView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LaunchImage"]];
launchScreenView.frame = self.window.bounds;
launchScreenView.contentMode = UIViewContentModeScaleAspectFill;
rootView.loadingView = launchScreenView;

Fügen Sie diese Zeilen wie im Kommentar von application didFinishLaunchingWithOptions in der Datei AppDelegate.m über der Zeile return YES .

Seltsam. Unter RN v.0.11.4 startet die App zuerst mit einem schwarzen Bildschirm und dann LaunchScreen.xib, bevor die App geladen wird. iOS 9 mit @arnemarts Fix https://github.com/facebook/react-native/issues/1402#issuecomment -130236507. Irgendwelche Ideen?

@irfaan Versuchen Sie, window.backgroundColor in etwas wie [UIColor redColor] zu ändern, das uns sagen sollte, ob die schwarze Farbe aus dem Fenster kommt oder etwas anderes.

self.window.backgroundColor = [UIColor redColor]; in didFinishLaunchingWithOptions hat nichts geändert. Noch schwarz vor LaunchScreen.xib. Also nicht aus dem Fenster, wie es scheint @nicklockwood

Wie empfehlen Sie mir, dies zu debuggen?

Es hört sich so an, als würde iOS Ihre launchScreen.xib erst dann laden, wenn die App geladen wurde (an diesem Punkt zeigt React sie als loadingView an).

Vielleicht ist es ein Konfigurationsfehler in Xcode? Oder möglicherweise ein Fehler in iOS 9?

Hast du es an einem Gerät probiert oder nur am Simulator?

Danke @nicklockwood - ich hatte das Problem auf dem Gerät. Habe es im Simulator ausgeführt und es funktionierte einwandfrei, und dann gelöscht + auf dem Gerät ausgeführt und es funktioniert gut. Wirklich seltsam. Werde wieder posten, wenn das Problem wieder auftritt.

Hallo @genexliu , ich habe meinen "LaunchImage" -Satz von Bildern zu Images.xcassets/LaunchImage.launchimage/ hinzugefügt, aber weder der Code, den Sie eingefügt haben, noch mein LaunchScreen.storyboard können sie finden / verwenden (beide schlagen stumm fehl). Mein LaunchScreen-Storyboard wird korrekt geladen, da ich seine Hintergrundfarbe sehe, aber das referenzierte Bild wird nicht angezeigt. Irgendwelche Ideen?

Auch die Startsequenz beim Ausführen von XCode sieht normal aus, aber es scheint eine zusätzliche Ausführung der Startsequenz/extra white flash/etc zu geben, wenn natal launch aus der cmd-Zeile ausgeführt wird.

Es stellte sich heraus, dass mein Problem mit dem Storyboard, das LaunchImage nicht findet, anscheinend ein Fehler mit XCode war. Ich habe die Starteinstellung auf "Asset-Katalog verwenden" und dann wieder auf "Storyboard verwenden" geändert und es funktionierte. Es ist nicht klar, ob der Code von @genexliu für mich funktioniert oder nicht, da loadingViewFadeDelay keine Wirkung zu haben scheint.

Hier ist mein Code:

  UIImageView *launchScreenView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Images/LaunchImage"]];
  launchScreenView.frame = self.window.bounds;
  launchScreenView.contentMode = UIViewContentModeScaleAspectFill;
  rootView.loadingView = launchScreenView;
  rootView.loadingViewFadeDelay = 5000;

dennoch gibt es keine Verzögerung zwischen der Storyboard-LaunchImage-Anzeige und meinem ersten React render .

@"Images/LaunchImage" sieht für mich nicht richtig aus. Es ist wahrscheinlich nur @"LaunchImage"

Oh, hoppla, ja. Du hast recht. Das war ein falsches Einfügen - eine der Permutationen, die ich ausprobiert habe (aber nicht die erste).

Sehen Sie sich auch den Beispielcode in meinem obigen Kommentar von vor 3 Monaten an - es gibt viele Startbilddateien für verschiedene Geräteklassen.

Doh! Du hattest Recht. Nach dem Wechsel zurück zu LaunchImage funktioniert es jetzt. Vielen Dank!

Kann mir jemand eine Dokumentation dazu für Android zeigen?

+1 für Android

cc @dmmiller haben wir eine loadingView-Funktion auf Android?

Hallo, ich habe das gleiche Problem, und obwohl ich sehe, dass hier einige Lösungen veröffentlicht wurden, verstehe ich nicht, wo ich diesen Code einfügen soll. Nach meinem Verständnis besteht die Lösung darin, den Objective-C-Code zu ändern, nicht etwas, das in React Native selbst durchgeführt werden kann, richtig? Wohin geht in diesem Fall der gepostete Code? In der main.m-Datei im xcode-Projektstamm? Danke.

@CorpusCallosum der Code sollte in die Datei AppDelegate.m eingefügt werden, in der RCTRootView eingerichtet ist.

Danke @nicklockwood , das werde ich mal ausprobieren.

Hey, dieser Code funktioniert jetzt für mich, insofern ich den weißen Blitz nicht sehe und mein Bild in diesen Startbildschirm geladen wird, aber jetzt wird meine eigentliche App nicht geladen! Es bleibt einfach auf diesem Ladebildschirm, obwohl ich in meiner Konsole sehen kann, dass die App geladen und ausgeführt wird und sogar die Interaktion funktioniert (Tippen und Wischen), aber ich kann meine App überhaupt nicht sehen, sie hängt einfach fest auf diesem Startbildschirm. Irgendeine Idee warum?

Hier ist mein Code aus meiner AppDelegate.m-Datei:

  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 Sie können versuchen, die Zeile zu entfernen
rootView.loadingViewFadeDelay = 1000;
oder verfeinern Sie den Übergang zwischen dem Begrüßungsbildschirm und Ihrer App mit seinem Wert (ich denke, die Einheiten sind Sekunden, nicht Millisekunden, deshalb scheint er auf dem Begrüßungsbildschirm "hängen geblieben").
Wenn das Entfernen der Zeile für Sie nicht funktioniert, versuchen Sie, Werte zwischen 0-5 einzustellen (Sie können auch nicht ganzzahlige Werte einstellen).

Arbeitet für mich, danke Leute :)

Für diejenigen, die ihre Launchscreen-xib als loadingView verwenden möchten, ist hier der Code zum Einfügen in AppDelegate.m :

UIView *loading = [[[NSBundle mainBundle] loadNibNamed:@"LaunchScreen" owner:self options:nil] objectAtIndex:0];
rootView.loadingView = loading;
rootView.loadingViewFadeDelay = 1;

Die letzte Zeile ist optional, wie ich oben erwähnt habe, sie legt die Zeit fest, die loadingView bleibt, bevor zur App selbst übergegangen wird.

@david - vielen Dank dafür! Ich beschäftige mich damit, seit ich mit dem Testen von React Native begonnen habe. 👏

@david-a, @geriux : Ich musste auch launchScreenView.frame = CGRectZero; einstellen, da meine LaunchScreen.xib ein Hintergrundbild mit AspectFill-Inhaltsmodus hatte und es nicht richtig skalierte. Ich bin nach ein paar Versuchen und Fehlern zur Lösung gekommen, bin mir nicht sicher, was dies verursacht.

@BasitAli ja, tut mir leid, das sollte besser dokumentiert werden. Wenn Sie die Größe der Ansicht auf einen Wert ungleich Null setzen, wird sie auf dem Bildschirm zentriert. Wenn Sie ihn auf Null setzen, wird er auf den Bildschirm skaliert.

@david - vielen Dank! Ihr Kommentar sollte in die Boilerplate aufgenommen werden oder zumindest ein Teil der wichtigsten nativen React-Dokumentation sein. Ich bin mir nicht sicher, warum dieses Problem im März 2015 geschlossen wurde, es existiert eindeutig immer noch in RN 0.20 im Februar 2016.

Es wäre schön, wenn jemand die PR für das Dokument machen könnte.

Die Ratschläge Ihrer Jungs helfen mir sehr (auf IOS, funktioniert perfekt), findet jemand eine Möglichkeit, dies auf Android zu beheben?

@weiyisheng , ich verwende den von @braco vorgeschlagenen

@braco @BasitAli JA, es hat geholfen, ich werde es in meiner App verwenden, es ist eine gute Idee. Danke euch Jungs.

@BasitAli warum nicht aus Neugier auf iOS verwenden?

Meine Anwendung wird nahtlos vom Begrüßungsbildschirm zum Anmeldebildschirm animiert (das Logo bewegt sich nach oben und die Anmeldefelder springen heraus). Das rn-splashscreen-Plugin blendet aus, was nicht sehr gut zu meiner Animation passt. Ich musste es auf Android verwenden, da ich keine andere Wahl hatte.

@BasitAli es sieht so aus, als ob das Plugin Reactive-native-splashscreen der Einstellung rootView.loadingViewFadeDuration gehorcht, vorausgesetzt, Sie legen es fest, nachdem Sie es angehängt haben. Dies sollte also das Einblenden deaktivieren:

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

Gibt es eine Möglichkeit, diese kleine Meldung oben mit der Aufschrift "Laden aus vorgebündelter Datei" zu entfernen?

@rcai set freigabe

Ah! Danke!

Gibt es eine reaktive native Lösung für den Begrüßungsbildschirm beider Plattformen? Das Eintippen der inneren Dateien beider Plattformen macht die Verwendung von Reactive-native nutzlos. Einfache Antwort bitte. Danke

@rclai

Gibt es eine Möglichkeit, diese kleine Meldung oben mit der Aufschrift "Laden aus vorgebündelter Datei" zu entfernen?

Das wird im Release-Modus nicht angezeigt, nur im Debug-Modus. Wenn Sie es auch im Debug-Modus ausblenden möchten, können Sie es ausblenden, indem Sie [RCTDevLoadingView setEnabled:NO]; in Ihr AppDelegate einfügen.

@nicklockwood Hallo zusammen, ist das richtig? Wenn nicht, was soll ich ändern/löschen?

  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 sieht für mich

rootView.loadingViewFadeDelay

Auf einen größeren Wert (in Sekunden - Standardwert ist 0,25)

BEARBEITEN:

Diese Linie

UIImageView *imageView = [[UIImageView alloc] initWithFrame:(CGRect){CGPointZero, RCTScreenSize()}];

Sollte wohl einfach so sein

UIImageView *imageView = [[UIImageView alloc] init];

Danke, in welchem ​​Ordner soll ich diese Bilder hinzufügen? Brauche ich dafür extra Contents.json oder nicht? Ich habe mehrere Fehler in diesem Code, beginnend mit
(https://cloud.githubusercontent.com/assets/10398337/13778676/e01e3d32-eabf-11e5-95bf-d7a1205a5ca1.png)
Starren auf:

CGFloat height = MAX(RCTScreenSize().width, RCTScreenSize().height);

@ TeodorKolev Xcode verfügt über eine GUI zum Hinzufügen. Klicken Sie auf Images.xcassets, klicken Sie dann auf die Schaltfläche + und wählen Sie "App-Symbole & Startbilder" > "Neues iOS-Startbild".

screen shot 2016-03-15 at 13 47 48

@TeodorKolev um die Fehler zu beheben, müssen Sie hinzufügen

#import "RCTUtils.h"

In Ihrem AppDelegate.

Vielen Dank, aber ich möchte den Begrüßungsbildschirm sehen, bis meine WebView-URL vollständig geladen ist, und jetzt funktioniert es nicht so. Respektieren!

@nicklockwood Hast du ein Heilmittel dafür?

Was ist die aktuelle Methode, um dies zu beheben? Da es ein Jahr und ein paar Monate her ist, seit das Problem aufgetreten ist, bezweifle ich, dass es jemals wirklich behoben wird, also frage ich mich, was das aktuelle Heilmittel ist. Welche Datei muss geändert und welcher Code geändert werden?

Bearbeiten: Ich verwende nur einen schwarzen Bildschirm mit launchscreen.xib, aber nach der Hälfte wird er weiß, bevor die App vollständig geladen wird.

@hasen6 das Problem wurde bereits behoben, es sind jedoch noch einige Arbeiten seitens des Entwicklers erforderlich.

Wie in den Kommentaren oben besprochen, müssen Sie rootView.loadingView mit einigen Inhalten festlegen, die anstelle des weißen Bildschirms angezeigt werden, und rootView.loadingViewFadeDelay anpassen, um sicherzustellen, dass die Ladeansicht nicht vor Ihrem App wurde geladen.

Wenn Sie nur einen schwarzen Bildschirm anzeigen möchten, müssen Sie sich möglicherweise nicht um einen loadingView kümmern und setzen einfach das rootView.backgroundColor auf schwarz, aber Sie müssen experimentieren.

Ich habe rootView.backgroundColor = [UIColor clearColor]; in rootView.backgroundColor geändert = [UIColor blackColor]; but it didn't make any difference. Doing a search in XCode for rootView.loadingView` hat keine Ergebnisse zurückgegeben.

@hasen6 Sie müssen herausfinden, woher die weiße Farbe kommt - es kann sein, dass es eine Ansicht in Ihrer JS-App gibt, die weiß ist und eine Weile angezeigt wird, bevor der Inhalt geladen wird.

loadingView ist eine Eigenschaft von RCTRootView , von der Sie vermutlich eine Instanz in Ihrem AppDelegate haben. Der eigentliche Code rootView.loadingView wird nicht in Ihrem Xcode angezeigt, es sei denn, Sie haben ihn selbst hinzugefügt. Hier ist ein Beispiel dafür, wie Sie es verwenden könnten:

rootView.loadingView = [UIView new];
rootView.loadingView.backgroundColor = [UIColor blackColor];
rootView.loadingViewFadeDelay = 0.5; // measured in seconds

Meine App ist nirgendwo weiß. Alle meine Apps zeigen beim Laden den gleichen weißen Bildschirm, nachdem der Startbildschirm angezeigt wurde, daher bin ich mir sicher, dass dies kein Problem mit meinen Apps ist.

Also muss ich diesen Code in die appdelegate.m einfügen? Das hat auch nicht funktioniert. Ich denke, es muss fast unmöglich sein, es zu beheben, sonst wäre kein Jahr vergangen, in dem die Entwickler es immer noch nicht gelöst haben. Wenn man bedenkt, wie schlecht es Apps aussehen lässt, wäre es natürlich auch ganz oben auf der Liste, die es zu lösen gilt.

FWIW, so löse ich dieses Problem. Ich verwende LaunchScreen.xib und die Lösung von David-a:

UIView *loading = [[[NSBundle mainBundle] loadNibNamed:@"LaunchScreen" owner:self options:nil] objectAtIndex:0];
rootView.loadingView = loading;
rootView.loadingViewFadeDelay = 1;

Dieser Code wird direkt darunter eingefügt

RCTRootView *rootView = [[RCTRootView alloc] etc etc etc...]

Wenn ich diesen Code durch den Beispielcode von Nicklockwood ersetze, kehrt der weiße Blitz zurück.

Woah! Ok das funktioniert. Danke Grittath!

@grittathh @hasen6 ah, OK. Ich habe mich falsch daran erinnert, dass loadingView automatisch an den Bildschirm angepasst wurde, wenn es keine Größe hat, aber anscheinend war das nie der Fall ¯_(ツ)_/¯.

@hasen6 Hier ist eine modifizierte Version des Codes, die funktionieren sollte (die xib-Lösung ist auch in Ordnung, aber überflüssig, wenn Sie nur einen schwarzen Bildschirm verwenden).

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

Hinweis: 1 ist ein ziemlich großer Wert für loadingViewFadeDelay, da dies bedeutet, dass Benutzer eine zusätzliche Sekunde warten müssen, bevor die App gestartet wird. Ich schlage vor, ihn auf den niedrigsten Wert einzustellen, mit dem Sie davonkommen können (0,25 ist die Standardeinstellung, was für die meisten Apps in Ordnung ist).

Ja, ich fand 1 etwas lang und ich habe die Eröffnungsanimation in einer meiner Apps vermisst. Ich fand sogar 0,1 in Ordnung. Danke für Ihre Hilfe.

Ich stimme @hasen6 zu . Es erscheint sicherlich etwas seltsam, dass Benutzer sofort in Objective-C ( AppDelegate.m ) eintauchen und sofort nach dem Generieren einer React Native-App etwas Code optimieren müssen. Wäre es nicht möglich, dass React Native Code mit diesem bereits eingebauten Fix generiert? Oder eine abstraktere Lösung für die Startbildschirmkonfiguration aus JavaScript (oder einer deklarativen Konfigurationssprache) einzuführen?

@johanatan Ironischerweise haben die beiden größten und am längsten anhaltenden Probleme mit React Native mit einer Art weißen Blitz zu tun. Dieser Fehler und das weiße Blinken auf Bildern.

Wenn ich mein LaunchScreen xib verwende, ist es in der Regel größer, gibt es Lösungen?

Was ist tendenziell größer?

UIView *loading = [[[NSBundle mainBundle] loadNibNamed:@"LaunchScreen" owner:self options:nil ] obje ctAtIndex:0 ];
rootView.loadingView = lädt;

Die UI-Ansicht beim Laden scheint sich nicht in der Größe zu ändern, es soll derselbe sein wie mein Begrüßungsbildschirm, der meine LaunchScreen.xib ist

Ich verwende Größenklassen und Einschränkungen übrigens

@akoshdee das ist richtig - Sie müssen die Ansichtsgröße explizit auf die Bildschirmgröße einstellen. Verwenden von

loading.frame = [UIScreen mainScreen].bounds;

Rahmen schon gewechselt aber funktioniert immer noch nicht

jede lösung für android?

@ajoshdee Die loadingView.frame = [UIScreen mainScreen].bounds; Zuweisung hat bei mir nicht funktioniert, aber dies hat funktioniert: loadingView.frame = self.window.bounds;

Das verwende ich:

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

Hallo! Ich habe die Farbe eingestellt, um die Ansicht zu reagieren:
rootViewController.view.backgroundColor = [UIColor blackColor];

@py110 @ajwhite

Die Android-Lösung ist so dumm, dass ich mich selbst ärgere, wie lange es gedauert hat, es herauszufinden.

Es handelt sich um einen 3-stufigen Splash-Screen.

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

Ich hatte eine ähnliche Implementierung @mehcode -- Ich mag jedoch, was Sie hier haben. Ich habe nach einer Möglichkeit gesucht, auf den RN Instance Manager zuzugreifen, habe aber nicht gesehen, dass es einen getReactNativeHost() Aufruf gab, sehr gut zu wissen.

Ich hatte Folgendes getan (nicht glücklich darüber)

  1. SplashActivity beim Öffnen der App gestartet
  2. Öffnet sofort die MainActivity und finish()
  3. MainActivity beginnt das SplashActivity mit einem Flag, das anzeigt, dass es sich im "Vordergrund-Modus" befindet, sobald der Splash über dem MainActivity . Nach kurzer Zeit schließt sich das SplashActivity und gibt die App frei.

@ajwhite

Danke. Der Effekt ist sehr glatt.

In meinen aktuellen Projekten habe ich buchstäblich ReactActivity in meine Codebasis kopiert und die mReactInstanceMangager geschützt statt privat gemacht.

In React-Native 0.29 (hätte im Kommentar sagen sollen) hat uns das React-Native-Team eine öffentliche Methode getReactNativeHost() , um hineinzukommen.

Dieser ReactNativeHost Container ist ein brillanter Schachzug. Dies ist genau das Problem, auf das ich gestoßen bin - nicht in der Lage zu sein, sich von der MainActivity aus in den Lebenszyklus einzuklinken.

Referenz für Interessierte: https://github.com/facebook/react-native/commit/49f20f41546e3ba8e7fe43c84c4c701684d0434d#diff -1346852de0c7f8466a36d42de50ec808R20

Um dies zu ergänzen...

Eine Lösung, die ich gefunden habe, bestand darin, rootView eine Hintergrundfarbe zuzuweisen, aber [UIColor colorWithPatternImage:img] .

Dies erfordert keine Verzögerungen, um sicherzustellen, dass es bis zum vollständigen Laden sichtbar bleibt.

Ein vollständiges Snippet (und mit dem von @dvine-multimedia bereitgestellten Tipp), das das gewünschte LaunchImage für das Gerät findet, ist unten:

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

Das LaunchImage bleibt nun sichtbar, bis das reaktive Bundle vollständig geladen ist.

Ich habe fast jeden Codeblock in dieser Unterhaltung ohne Chance ausprobiert, aber dieser hat perfekt funktioniert.
Danke @dbonner1987 !

eine lösung für android?

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


@sercanov @dbonner1987 Dies verwendet auch den oben genannten Ansatz für iOS, um den Javascript-Startbildschirm zu

@arnemart Danke, funktioniert immer noch irgendwie in RN 0.30.0. Ich musste meine App löschen und neu installieren. Es hatte das erste Mal den weißen Blitz, aber danach keinen mehr.

@nicklockwood Gibt es eine Art Rückruf, den ich verwenden kann, um zu wissen, wann das eigentliche Javascript geladen wird. Der Grund dafür ist, dass beim Navigieren meiner App zwischen Seiten eine gewisse Transparenz vorhanden ist, bei der rootView.backgroundColor im Hintergrund der Ansicht sichtbar ist. Ich habe auch ein ähnliches Problem mit dem Schubladen-Plugin, das ich während des Übergangs zum Öffnen der Schublade verwende.
Also ich würde gerne etwas machen wie:

  • Legen Sie die rootView-Hintergrundfarbe für das Launcher-Bild fest, indem Sie während des Ladevorgangs den obigen Ansatz von
  • Wenn das Javascript fertig geladen ist und die erste Navigationsroute beginnt (oder etwas in diese Richtung)
  • Setzen Sie die Hintergrundfarbe von rootView wieder auf Weiß.

Ich brauche also grundsätzlich einen Rückruf, um zu wissen, wann das Laden abgeschlossen ist.

@mehcode das ist perfekt danke!!

Hat jemand Vorschläge, wie man ein LaunchScreen.storyboard implementiert, das sich nach dem Laden des Bundles ausschaltet? Derzeit wird es für eine bestimmte Zeit angezeigt, dann sehe ich einen weißen Bildschirm und dann lädt die Anwendung RN 34.1 xcode 8

@ajoshdee Ich hatte ähnliche Probleme, bei denen die Ansicht viel größer war als der Bildschirm. Ich bin mir nicht sicher, ob es damit zusammenhängt, aber ich habe AutoLayout in meinem LaunchScreen.xib .

Ich musste auch einstellen

launchScreenView.autoresizingMask = UIViewAutoresizingNone;

Um es richtig zu dimensionieren.

Also https://github.com/facebook/react-native/issues/1402#issuecomment -166963438 mit dieser zusätzlichen Zeile oben

Sie können die Startfarbe auch aktualisieren, indem Sie diese Zeile in appdelegate.m ersetzen:

rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];

durch diese Zeile:
rootView.backgroundColor = [[UIColor alloc] initWithRed:0.94 green:0.90 blue:0.89 alpha:1.0];

und finden Sie die gewünschte Farbe mit dieser Website

Hat jemand die Lösung dieses auf Android geschafft?

Hier ist eine Lösung für iOS und Android: https://github.com/mehcode/rn-splash-screen .
Ich habe den Splash-Screen in der Render-Funktion meiner app.tsx (dem Einstiegspunkt) versteckt und das gleiche Bild gezeigt, bis alle meine https-Anfragen erledigt waren.

Mein Code:
```
öffentlich 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>
    );

}

```

Gibt es eine Lösung dafür, wenn ich Storyboard für den Begrüßungsbildschirm verwende? Ich habe nicht mehr meine Startbildschirmbilder für jede Dimension.

Ändern Sie in React native for iOS in AppDelegate.m die folgende Zeile, indem Sie Ihre RGB-Farbcodes entsprechend schreiben:

rootView.backgroundColor = [[UIColor alloc] initWithRed:52.0f/255.0f green:73.0f/255.0f blue:94.0f/255.0f alpha:1];

Für ROT ändern Sie die Zahl 52
Für GRÜN ändern Sie die Zahl 73
Für BLAU ändern Sie die Zahl 94

_Hinweis: Ich verwende React native v0.51.0_

Gibt es noch keine Lösung für Android?

@otoinsa siehe obige Antwort https://github.com/facebook/react-native/issues/1402#issuecomment -339336380 von @neomib. Es gibt einige andere Splash-Screen-Bibliotheken, die genauso gut funktionieren, zB für https://github.com/crazycodeboy/react-native-splash-screen.

Irgendein Vorschlag zum Storyboard, das als LaunchScreen verwendet wird?

Mein Ansatz war so (aber die App stürzt beim Start ab)

- (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;
}

die App stürzt mit folgendem Fehler ab:

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 -

Danke.

ersetzt

UIStoryboard *storyboard = self.window.rootViewController.storyboard;

mit

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"LaunchScreen" bundle:nil];

Jetzt startet die App, aber ich bekomme einen schwarzen Hintergrund.

Oder Sie können https://github.com/crazycodeboy/react-native-splash-screen verwenden, es ist viel einfacher :)

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen