React-native: [تهيئة] شاشة إطلاق فلاش أبيض

تم إنشاؤها على ٢٦ مايو ٢٠١٥  ·  138تعليقات  ·  مصدر: facebook/react-native

أنا فقط أتساءل عما إذا كانت هناك ممارسة جيدة حول LaunchScreen. السبب الذي يجعلني أطالب بذلك هو ، إذا أضاف أحدهم LaunchScreen ، فسيكون هناك وميض أبيض قبل أن يبدأ رد الفعل الأصلي ويحمل التطبيق. هل هناك أي طريقة يمكننا من خلالها منع هذا؟

AsyncStorage Locked

التعليق الأكثر فائدة

للإضافة إلى هذا ...

كان الحل الذي وجدته هو تعيين لون للخلفية rootView مع استخدام [UIColor colorWithPatternImage:img] .

لا يتطلب هذا أي تأخير لضمان بقائه مرئيًا حتى يتم تحميله بالكامل.

يوجد أدناه مقتطف كامل (وباستخدام التلميح المقدم من @ dvine-multimedia) والذي سيجد صورة LaunchImage المطلوبة للجهاز:

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 مرئيًا حتى يتم تحميل حزمة التفاعل الأصلية بالكامل.

ال 138 كومينتر

alinz - تم إصلاح هذا في الإصدار التالي: https://github.com/tadeuzagallo/react-native/commit/8d992262ed2dcf0d46e8d22e605764902c33012f

liubko نعم ، هذا بالضبط ما أريد التخلص منه. لم أقم بتطبيق التصحيح بعد لكنني سأفعل ذلك الليلة.

brentvatne : لا أرى كيف يمكن لهذا التصحيح أن يحل هذه المشكلة (إذا كنت أعمى / غبي ، يرجى أن تسامح :-). تكمن المشكلة في وجود لحظة بين بدء تشغيل التطبيق واستمرار عمل React. من الناحية المثالية ، ستظهر شاشة LaunchScreen حتى تنتهي React ويتم عرضها بالكامل كما هو الحال في تطبيق "أصلي بالكامل".

oblador - آه ، سيسمح لك هذا بالانتقال بسلاسة أكبر من خلال الحصول على نفس لون الخلفية لشاشة التشغيل في لحظة "الوميض".

vjeux - كيف يمكنك تجاوز هذه المشكلة في تطبيقات FB؟ لقد لاحظت أن F8 ، الذي إذا فهمت بشكل صحيح هو 100٪ React Native ، ينتقل مباشرة من شاشة التشغيل إلى التطبيق. cc نيكلوكوود

هناك إصلاح (منفصل) لهذه المشكلة أيضًا. استخدم خاصية loadingView RCTRootView ، واضبطها على وضع ملء الشاشة 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 هو تحميل شاشة التشغيل xib إذا كنت تستخدم نظام التشغيل iOS 8+.

ide أنا أستخدم Launchscreen xib. أرى شاشة lauchscreen الخاصة بي في وقت التشغيل ولكن قبل بدء تشغيل تطبيقي ، أرى عرضًا أبيض (وميض).

alinz ، أعتقد أن ide يعني استخدام شاشة الإطلاق xib لتعيين عرض تحميل RCTRootView (والذي ما زلت بحاجة إلى القيام به يدويًا). لا يوجد دعم تلقائي للقيام بذلك (حتى الآن).

للتوضيح ، يخفي iOS شاشة التشغيل عند النقطة التي يبدأ فيها تحميل React. لتجنب رؤية شاشة فارغة ، ستحتاج إلى تمديد الوقت الذي يتم فيه عرض شاشة التشغيل من خلال إظهار نفس طريقة العرض يدويًا مثل عرض تحميل RCTRootView.

شكرا nicklockwood للتوضيح. كان هذا سيئتي. :)

Curtesy من 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-multimedia هل يعمل ذلك بشكل أفضل من مقتطف الشفرة الذي قدمته أعلاه؟

@ myusuf3

nicklockwood في الواقع يفعلون نفس الشيء كثيرًا. عندما بدأت في النظر في هذا ، ربما لم أفهم ما يجب فعله بقصك لعدم وجود أي تجربة xcode. عندما وصلت أخيرًا إلى النقطة التي فهمت فيها ما يجب أن أفعله ، لم أدرك أنك كنت هناك بالفعل. بجانب ذلك ، أنا شخصياً أجد الحل "الخاص بي" أكثر قابلية للقراءة. لكن ذلك جماليات خالصة.

nicklockwood لقد جربت الكود الخاص بك ولكني ما زلت أرى وميضًا أبيض. لقد قمت بإنشاء صورة تشغيل لتعيينها كعرض تحميل. صورة الإطلاق هي نفسها LaunchScreen.xib.

هذا هو الشيء الوحيد الذي يوقف إطلاق تطبيقنا. حقا نقدر أي مساعدة في هذا.

هل يظهر الفلاش بعد إخفاء صورة التشغيل أم لا تظهر صورة التشغيل؟ (قد يكون من الصعب تحديد ذلك بمجرد النظر - قم بتغيير صورة التشغيل إلى شيء مثل مستطيل أحمر ثابت بشكل مؤقت للتأكد).

nicklockwood حاولت تغيير اللون بين ملف xib وصورة launchScreen. كنت ما زلت أرى هذا الوميض.

يبدو الرمز الخاص بي كما يلي:

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

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

لقد قمت بإزالة آخر سطرين تحميلViewFadeDelay والمدة الآن ويبدو أن المشكلة قد تم حلها. لا أرى أي وميض. انتقال سلس لطيف.

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

موافق. بالحفر بشكل أعمق ، يبدو أن الفلاش ربما يجعل تطبيقي لا يعرض شيئًا حتى يتم تحميل قيمة من متجر غير متزامن.

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

أعتقد أن تحميل loadingView يعتقد أن js انتهى من التقديم ويخفي loadingView. على الرغم من أن js انتهيت للتو من العرض بهذا return null

nicklockwoodalinz أنا فقط اطلاق النار في الهواء. قد لا يكون السبب الحقيقي. ماذا تظنون يا جماعة.

هناك شيء واحد لاحظته أيضًا وهو أنه إذا قمت بتعيين قيم loadingViewFadeDelay وما إلى ذلك على 0.30 أو أعلى ، فسيكون الانتقال سلسًا للغاية. القيم الافتراضية هي 0.25 وهي أيضًا سلسة.

الغرض من loadingFadeDelay هو تغطية السيناريو الذي لا يعرض فيه تطبيقك أي شيء على الفور ، لذا فأنت تستخدمه بشكل صحيح.

قد ترغب في التفكير في إعداد loadingViewFadeDelay بشكل صريح ، في حالة تغير الإعداد الافتراضي على الإطلاق - وتأكد من الاختبار على أبطأ جهاز تدعمه ، في حالة استغراق وقت أطول للتحميل.

يعجبني حل nicklockwood ولكن عليك مراعاة زمن

أحد الحلول الأخرى هو تعيين حالة المكون على نوع من القيمة الافتراضية لإخبار المكون الخاص بك بعرض نوع من مربع حوار التحميل.

رائع. أعتقد أن لدي الحل.

ما رأيكم يا رفاق في وجود 3 مكونات كلها متشابهة.

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

لست متأكدًا من كيفية تحجيم النقطة 3 على أجهزة مختلفة. هل من الممكن أن تقترحوا ذلك يا رفاق؟

إذا كان وقت بدء التشغيل يعتمد على الشبكة ثم الاختبارات ، فأنا بالتأكيد أدعو إلى رسم عرض "فارغ" على الفور بدلاً من الأمل في أن يتم تنزيله بشكل أسرع من تأخير التلاشي.

يعتمد على التخزين غير المتزامن. لا توجد شبكة

سواء كنت تعتمد على الشبكة أم لا ، فأنا لا أحب حقًا استخدام عرض قاعدة الوقت. لا توجد طريقة يمكنك من خلالها ضمان 100٪ أن الوقت الذي تحدده دقيق. يجب عليك دائمًا عرض شيء ما للمستخدم للإشارة إلى حدوث شيء ما ولكنه ليس جاهزًا للعرض. هذا مجرد اقتراح.

متفق. الغرض من loadingView ، مثل صورة تحميل iOS القياسية ، هو التغطية حتى يصبح تطبيقك جاهزًا لعرض شيء ما ، حتى لو كان كل التطبيق جاهزًا للعرض هو أداة تحميل دوارة.

ومع ذلك ، فإن السبب في أنني جعلتها طريقة عرض بدلاً من صورة هي أنه يمكنك جعلها غير ثابتة. يمكنك إضافة UIActivityIndicatorView إلى 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;

إنها ليست صورة إطلاق ، إنها عرض_إطلاق ، لذا يمكنك وضع imageView الخاص بك داخل عرض حاوية آخر واستخدام الحاوية كعرض الإطلاق:

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

صحيح ، أفترض أنه يمكنني جعل الغلاف يملأ مساحة الشاشة ويضع الصورة في الأعلى. سيتم وضع الغلاف تلقائيًا في الوسط بواسطة RootView على ما يبدو https://github.com/facebook/react-native/blob/757d6d204ae2d743634af64e3f78a4aad9d53f70/React/Base/RCTRootView.m#L191.

Intellicode نعم.

لقد كسرت تطبيقي في الإنتاج على iphone 4s باستخدام كود @ dvine-multimedia. الإصلاح هو مجرد وضع استراحة في إذا.

حدث عطل آخر لأن containsString غير متاح على نظام التشغيل iOS 7.

nicklockwood يتساءل عما إذا كان عرض التحميل سيختار تلقائيًا أفضل دقة ممكنة؟

لا يختار loadingView صورة على الإطلاق ، بل يستخدم فقط ما تمرره. المقتطف الذي نشرته أعلاه للعثور على بدء التشغيل سيحدد الدقة الصحيحة للجهاز بالرغم من ذلك.

على الرغم من ذلك ، فإن المقتطف الخاص بك لا يختار المقتطف ذي الأبعاد الصحيحة. أي إصلاح لذلك؟

هل كنت تستخدم الحل الخاص بي أو dvine؟ ما طراز iPhone الذي تستخدمه؟ عمودي أم أفقي؟

عند استخدام dvine ، فإنه يأخذ البعد الصحيح. مع الحل الخاص بك هو وجود مساحة سوداء حول الصورة. أفترض أن المساحة السوداء هي لأنها تلتقط الصورة بأبعاد خاطئة.

أنا على جهاز iphone 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 . لست متأكدا كيف فاتني ذلك. اسف هذا خطأي.

شكرا للمساعدة هنا. سوف مواطنه استخدام هذا الرمز في الإصدار القادم. يبدو أنه يغطي جميع الحالات أيضًا. لا تحتاج المناظر الطبيعية.

هيه ، أعتقد أنني أخفض من بيعه. ربما كان يجب أن أقول "هذا ما نستخدمه في الإنتاج حاليًا ، ويبدو أنه يعمل بشكل جيد" :-)

"هذا ما نستخدمه في الإنتاج الآن" كان سيوفر لنا بعض النجوم في متجر التطبيقات. هاها. لا قلق. هناك دائما نسخة جديدة لإنقاذ العالم. :)

إغلاق هذه المشكلة راجع للشغل؟

سأذهب وأغلق هذه التذكرة حيث تمت مناقشتها بالكامل بالتفصيل ولدينا بعض الحلول الجيدة.

فقط لتوضيح هذا بنسبة 100٪ لأولئك الذين يستخدمون LaunchScreen xib ، إليك الكود الذي سيجعل ذلك يعمل:

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

أضف هذه السطور إلى طريقة application didFinishLaunchingWithOptions في الملف AppDelegate.m ، أعلى السطر الذي يقول return YES .

arnemart لنكون أكثر وضوحًا أن الطريقة ستعمل فقط مع نظام iOS 8+ ، أليس كذلك؟

@ أرنمارت شكرا! يعمل بشكل مثالي .

بالنسبة لأولئك الذين يستخدمون LaunchImage ، فأنت بحاجة إلى تعيين كل من frame و contentMode للصورة لتوسيع نطاقها بشكل صحيح:

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

تمامًا مثل التعليق من arnemart ، أضف هذه السطور إلى طريقة application didFinishLaunchingWithOptions في الملف AppDelegate.m ، أعلى السطر الذي يقول return YES .

عجيب. في RN v.0.11.4 ، يتم تشغيل التطبيق أولاً بشاشة سوداء ثم LaunchScreen.xib قبل تحميل التطبيق. دائرة الرقابة الداخلية 9 ث /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 على أنه عرض التحميل).

ربما يكون خطأ في التكوين في Xcode؟ أو ربما خطأ في iOS 9؟

هل جربت جهازًا أم جهاز محاكاة فقط؟

شكرًا nicklockwood - لقد كنت أواجه المشكلة على الجهاز. قم بتشغيله في جهاز المحاكاة وعمل بشكل مثالي ، ثم تم حذفه + تشغيله على الجهاز وهو يعمل بشكل جيد. غريب حقا. سيتم النشر مرة أخرى إذا ظهرت المشكلة مرة أخرى.

مرحبًا genexliu ، لقد أضفت مجموعة "LaunchImage" الخاصة بي من الصور إلى Images.xcassets/LaunchImage.launchimage/ ولكن لا الرمز الذي لصقته ولا LaunchScreen.storyboard الخاص بي يمكنه العثور عليها / استخدامها (كلاهما يفشل بصمت). يتم تحميل لوحة العمل الخاصة بي في LaunchScreen بشكل صحيح حيث أرى لون خلفيتها ولكنها لا تعرض الصورة المشار إليها. أيه أفكار؟

أيضًا تسلسل بدء التشغيل عند التشغيل من XCode يبدو طبيعيًا ولكن يبدو أن هناك تشغيلًا إضافيًا لتسلسل البداية / وميض أبيض إضافي / إلخ عند تشغيل natal launch من سطر cmd.

تبين أن مشكلتي مع Storyboard التي لم أجد فيها LaunchImage كانت على ما يبدو خطأ في 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 لأجهزة Android

ccdmmiller هل لدينا ميزة loadingView على Android؟

مرحبًا ، أواجه نفس المشكلة ، وعلى الرغم من أنني أرى بعض الحلول المنشورة هنا ، إلا أنني لا أفهم مكان وضع هذا الرمز. من وجهة نظري ، الحل هو تغيير كود Objective-C ، وليس شيئًا يمكن القيام به داخل React Native نفسها ، أليس كذلك؟ في هذه الحالة ، أين يذهب الرمز المدون؟ في ملف main.m في جذر مشروع xcode؟ شكرا.

CorpusCallosum ، يجب أن تنتقل الشفرة إلى ملف AppDelegate.m ، حيث تم إعداد RCTRootView.

شكرًا 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 (يمكنك أيضًا تعيين قيم غير صحيحة).

العمل من أجلي ، شكرا يا رفاق :)

بالنسبة لأولئك الذين يرغبون في استخدام شاشة التشغيل xib الخاصة بهم كعرض تحميل ، إليك الكود المطلوب إدراجه في AppDelegate.m:

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

السطر الأخير اختياري ، كما ذكرت أعلاه ، فهو يحدد الوقت الذي ستبقى فيه loadingView قبل الانتقال إلى التطبيق نفسه.

@ david-a شكرا جزيلا لك على ذلك! لقد كنت أتعامل مع هذا منذ أن بدأت في اختبار رد الفعل الأصلي. 👏

@ david-a، geriux : اضطررت أيضًا إلى تعيين launchScreenView.frame = CGRectZero; حيث كان لدي LaunchScreen.xib صورة خلفية مع وضع محتوى AspectFill ولم يتم تغيير الحجم بشكل صحيح. وصلت إلى الحل بعد بعض التجارب والأخطاء ، لست متأكدًا من سبب ذلك.

BasitAli نعم ، آسف ، يجب توثيق ذلك بشكل أفضل. إذا قمت بتعيين حجم العرض على غير صفري ، فسيتم توسيطه في الشاشة. إذا قمت بتعيينه على الصفر ، فسيتم تحجيمه ليناسب الشاشة.

@ ديفيد أ شكرا جزيلا لك! يجب تضمين تعليقك في النموذج المعياري ، أو على الأقل أن يكون جزءًا من التوثيق الأصلي للتفاعل الرئيسي. لست متأكدًا من سبب إغلاق هذه المشكلة في مارس 2015 ، فمن الواضح أنها لا تزال موجودة في RN 0.20 في فبراير 2016.

سيكون من الجيد أن يقوم شخص ما بعمل العلاقات العامة للمستند.

تساعدني نصائح رفاقك كثيرًا (على IOS ، تعمل بشكل مثالي) ، هل يجد أي شخص طريقة لإصلاح ذلك على Android؟

weiyisheng ، أنا أستخدم التفاعلية على النحو الذي اقترحه

bracoBasitAli نعم ، ساعدني ذلك ، سأستخدمه في تطبيقي ، إنها فكرة جيدة. شكرا يارفاق.

BasitAli لماذا لا تستخدمه على iOS بدافع الفضول؟

يتحرك تطبيقي بسلاسة من شاشة البداية إلى شاشة تسجيل الدخول (يتحرك الشعار لأعلى وتقفز حقول تسجيل الدخول للخارج). يتلاشى المكون الإضافي rn-splashscreen والذي لا يتوافق جيدًا مع الرسوم المتحركة الخاصة بي. اضطررت إلى استخدامه على Android لأنه لم يكن لدي خيار آخر.

BasitAli ، يبدو أن المكوّن الإضافي رد فعل أصلي rootView.loadingViewFadeDuration ، بشرط أن تقوم بتعيينه بعد إرفاقه ، لذلك يجب أن يؤدي هذا إلى تعطيل التلاشي:

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

هل هناك أي طريقة لإزالة هذه الرسالة الصغيرة في الأعلى والتي تقول "جارٍ التحميل من ملف مجمع مسبقًا"؟

rclai وضع مخطط للإفراج

آه! شكرا!

هل هناك أي حل أصلي للتفاعل لكل من شاشة البداية في النظامين الأساسيين؟ الكتابة في كلا النظامين الأساسيين للملفات الداخلية تجعل استخدام رد الفعل الأصلي عديم الفائدة .. إجابة بسيطة من فضلك. شكرا

تضمين التغريدة

هل هناك أي طريقة لإزالة هذه الرسالة الصغيرة في الأعلى والتي تقول "جارٍ التحميل من ملف مجمع مسبقًا"؟

لا يظهر ذلك في وضع الإصدار ، فقط في وضع التصحيح. إذا كنت تريد إخفاءه في وضع التصحيح أيضًا ، فيمكنك إخفاؤه بوضع [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 لديه واجهة المستخدم الرسومية

screen shot 2016-03-15 at 13 47 48

TeodorKolev لإصلاح الأخطاء ، تحتاج إلى إضافة

#import "RCTUtils.h"

في AppDelegate الخاص بك.

شكرًا جزيلاً لك ، لكني أريد أن أرى شاشة البداية حتى يتم تحميل عنوان url الخاص بـ WebView بالكامل ، والآن لا يعمل على هذا النحو. احترام!

nicklockwood هل لديك أي علاج لهذا واحد؟

ما هي الطريقة الحالية لإصلاح هذا؟ منذ مرور عام وبضعة أشهر على ظهور المشكلة ، أشك في أنه سيتم حلها فعليًا ، لذلك أتساءل ما هو العلاج الحالي. ما هو الملف الذي يجب تعديله وما الرمز الذي يجب تعديله؟

تحرير: أنا فقط أستخدم شاشة سوداء مع launchscreen.xib ولكن في منتصف الطريق يتحول إلى اللون الأبيض قبل تحميل التطبيق بالكامل.

@ hasen6 تم إصلاح المشكلة بالفعل ، ولكن هناك بعض العمل المطلوب من جانب المطور.

كما تمت مناقشته في التعليقات أعلاه ، تحتاج إلى تعيين rootView.loadingView مع بعض المحتوى لإظهاره مكان الشاشة البيضاء ، وضبط rootView.loadingViewFadeDelay لضمان عدم إخفاء عرض التحميل قبل انتهى التطبيق من التحميل.

إذا كنت ترغب فقط في إظهار شاشة سوداء ، فقد لا تحتاج إلى عناء تحميل ViewView وقم فقط بتعيين 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؟ هذا لم ينجح أيضًا. أعتقد أنه يجب أن يكون من المستحيل تقريبًا إصلاحه وإلا لما مر عام ولم يقم المطورون بحله بعد. بالنظر إلى مدى سوء ظهور التطبيقات ، فمن الواضح أنه سيكون على رأس القائمة التي يجب حلها أيضًا.

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 تم تغيير حجمه تلقائيًا ليناسب الشاشة إذا كان حجمها صفريًا ، ولكن يبدو أن هذا لم يكن كذلك أبدًا ¯_ (ツ) _ / ¯.

@ hasen6 هنا نسخة معدلة من الكود يجب أن تعمل (حل xib جيد أيضًا ، لكنه زائد إذا كنت تستخدم شاشة سوداء فقط).

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

ملاحظة: 1 هي قيمة كبيرة جدًا ل loadingViewFadeDelay لأنه يعني أنه يتعين على المستخدمين الانتظار ثانية إضافية قبل بدء التطبيق. أقترح تعيينه على أقل قيمة يمكنك التخلص منها (0.25 هو الإعداد الافتراضي ، وهو أمر جيد بالنسبة لمعظم التطبيقات).

نعم ، لقد وجدت أن الرقم 1 كان طويلاً بعض الشيء وكنت أفتقد الرسوم المتحركة الافتتاحية في أحد تطبيقاتي. لقد وجدت حتى 0.1 ليكون جيدًا. شكرا لمساعدتك.

أتفق مع @ hasen6 . من المؤكد أنه يبدو غريبًا بعض الشيء أن يتعين على المستخدمين الغوص فورًا في Objective-C ( AppDelegate.m ) وتعديل بعض التعليمات البرمجية فور إنشاء تطبيق React Native. ألن يكون من الممكن لـ React Native إنشاء رمز باستخدام هذا الإصلاح المخبوز بالفعل؟ أو لتقديم حل أكثر تجريدًا لتهيئة شاشة البدء من JavaScript (أو لغة تكوين تعريفية)؟

johanatan من المفارقات أن أكبر مشكلتين

عندما أستخدم LaunchScreen xib الخاص بي ، فإنه يميل إلى أن يكون أكبر ، فهل توجد حلول؟

ما الذي يميل إلى أن يكون أكبر؟

UIView * loading = [[[NSBundle mainBundle] loadNibNamed: @ مالك "LaunchScreen" خيارات ذاتية : لا شيء ] obje ctAtIndex: 0 ] ؛
rootView.loadingView = تحميل ؛

عرض واجهة المستخدم التي يتم تحميلها ، لا يبدو أنه يتم تغيير حجمها ، فمن المفترض أن تكون هي نفسها شاشة البداية الخاصة بي وهي 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];

تضمين التغريدة

حل Android بسيط للغاية لدرجة أن أكون منزعجًا من نفسي لطالما استغرقت اكتشافه.

إنه يتضمن شاشة دفقة من 3 مراحل.

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

كان لدي تطبيق @ mehcode - أحب ما لديك هنا بالرغم من ذلك. لقد كنت أبحث عن طريقة للوصول إلى مدير مثيل RN ، ولم أر أن هناك مكالمة getReactNativeHost() ، من الجيد معرفة ذلك.

لقد فعلت ما يلي ، (لست سعيدًا بذلك)

  1. SplashActivity عند فتح التطبيق
  2. يفتح فورًا MainActivity و finish()
  3. يبدأ MainActivity SplashActivity بعلامة تشير إلى أنه في "الوضع الأمامي" بمجرد أن يبدأ في إظهار البقعة فوق MainActivity . بعد فترة قصيرة من الوقت ، يُغلق SplashActivity نفسه ليكشف عن التطبيق.

تضمين التغريدة

شكرا. التأثير سلس جدا.

في مشاريعي الحالية ، تم نسخ ReactActivity إلى قاعدة الشفرة الخاصة بي وجعلت mReactInstanceMangager محميًا بدلاً من خاص.

في رد الفعل الأصلي 0.29 (كان يجب ذكره في التعليق) أعطانا فريق التفاعل الأصلي طريقة عامة getReactNativeHost() للدخول فيه.

هذه الحاوية ReactNativeHost خطوة رائعة. هذه بالضبط هي المشكلة التي واجهتني - عدم القدرة على الارتباط بدورة الحياة من MainActivity.

المرجع للمهتمين: https://github.com/facebook/react-native/commit/49f20f41546e3ba8e7fe43c84c4c701684d0434d#diff -1346852de0c7f8466a36d42de50ec808R20

للإضافة إلى هذا ...

كان الحل الذي وجدته هو تعيين لون للخلفية rootView مع استخدام [UIColor colorWithPatternImage:img] .

لا يتطلب هذا أي تأخير لضمان بقائه مرئيًا حتى يتم تحميله بالكامل.

يوجد أدناه مقتطف كامل (وباستخدام التلميح المقدم من @ dvine-multimedia) والذي سيجد صورة LaunchImage المطلوبة للجهاز:

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 مرئيًا حتى يتم تحميل حزمة التفاعل الأصلية بالكامل.

لقد جربت كل كتلة تعليمات برمجية تقريبًا في هذه المحادثة دون أي فرصة ، لكن هذا كان يعمل بشكل مثالي.
شكرا @ dbonner1987 !

أي حل لالروبوت؟

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


sercanov @ dbonner1987 يستخدم هذا أيضًا الأسلوب المذكور أعلاه لنظام iOS للقيام بشاشة تشغيل جافا سكريبت.

شكرا @ أرنمارت ، لا يزال يعمل كيندا في 0.30.0 رينغيت ماليزي. اضطررت إلى حذف تطبيقي وإعادة تثبيته. كان لديه وميض أبيض في المرة الأولى ، ولكن لم يكن أي شيء بعد ذلك.

nicklockwood هل هناك نوع من رد الاتصال يمكنني استخدامه لمعرفة متى يتم تحميل جافا سكريبت الفعلي. والسبب في ذلك ، عندما يتنقل تطبيقي بين الصفحات ، هناك بعض الشفافية حيث يظهر rootView.backgroundColor في خلفية العرض. لدي أيضًا مشكلة مماثلة مع المكون الإضافي للدرج الذي أستخدمه أثناء انتقال الدرج المفتوح.
لذلك أود أن أفعل شيئًا مثل:

  • اضبط لون خلفية rootView على صورة المشغل ، باستخدام نهج @ dbonner1987 أعلاه أثناء عملية التحميل.
  • عندما ينتهي تحميل جافا سكريبت ويبدأ مسار التنقل الأول (أو شيء من هذا القبيل)
  • اضبط لون خلفية 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 .

كنت بحاجة إلى تعيين أيضا

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

}

""

هل هناك أي حل لهذا إذا كنت أستخدم لوحة العمل لشاشة البداية؟ لم يعد لدي صور شاشة التشغيل الخاصة بي لكل بُعد بعد الآن.

في رد فعل أصلي لنظام iOS داخل AppDelegate.m بتغيير السطر التالي عن طريق كتابة رموز ألوان RGB وفقًا لذلك:

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

بالنسبة إلى RED ، قم بتغيير الرقم 52
بالنسبة إلى اللون الأخضر ، قم بتغيير الرقم 73
بالنسبة إلى اللون الأزرق ، قم بتغيير الرقم 94

_ملاحظة: أنا أستخدم الإصدار 0.51.0 الأصلي من رد الفعل

ألا يوجد حتى الآن حل لنظام Android؟

otoinsa انظر الإجابة أعلاه https://github.com/facebook/react-native/issues/1402#issuecomment -339336380 بواسطةneomib. هناك بعض مكتبات شاشات البداية التي تعمل جيدًا أيضًا على سبيل المثال 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 التقييمات