ios 启动页和第一个场景之间短暂黑屏的解决方案

这两天在弄ios工程,发现启动页和第一个场景之间会有一个短暂的黑屏。作为ios小白的我第一个想法就是来论坛求助,逛遍论坛却没有发现一个真正的解决方案,按引擎组在其他贴回复的在appcontroller里面加图片的方法是会减少黑屏的时间但并不能完全解决问题。经过本人的不懈努力,充分发挥面向百度编程的精神。终于找到一个可行的方案。。。ios大神不用看,思路很简单。原理:在iOS RootViewController 构建视图的时候添加一个启动图,然后在main.js加载场景后将其移出

1、RootViewController.mm 修改如下代码

  • (void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];

    CGRect bounds = [[UIScreen mainScreen] bounds];

    UIImageView *backView = [[UIImageView alloc] initWithFrame: bounds];

    UIImage *ima = [UIImage imageNamed:@“xxxxxxx.png”];

    [backView setImage:ima];

    [self.view addSubview:backView];

}

+(void)removeBackLuanch{

UIViewController *rootVC = [[UIApplication sharedApplication].delegate window].rootViewController;

for(UIView* subview in rootVC.view.subviews){

    if([subview isKindOfClass:[UIImageView class]]){

        [subview removeFromSuperview];

    }

}

}

2、main.js 在第一个场景加载完成后,将其移出

jsb.reflection.callStaticMethod(“RootViewController”, “removeBackLuanch”);

文章链接https://www.cnblogs.com/shwhr/p/10637853.html

3赞

不错的分享,这个我可以试试。谢谢!!

是可行的,唯一不好的就是还要通过jsb调用下oc。
而且还可以对UIImageView *backView这个对象进行屏幕适配等。

main.js 在第一个场景加载完成后 指的是哪行代码呢

感谢大佬分享,同时也反馈一个问题:

RootViewController.mm 中的 viewWillAppear 生命周期方法中添加启动页图片存在一个问题:

当接入了激励视频广告后(比如:Admob),在看完广告回来后,RootViewController 会重新走一遍 viewWillAppear 生命周期回调方法,此时按照这个逻辑,会重新建立了一个ImageView,此时会挡住了游戏的 CCEAGLView。并且因为后续可能不会再次调用移除方法,从而造成看完视频回来后出现启动页永久挡住游戏的内容

针对这个问题,我参考 这里 的文章以及结合本文章的进行的一些修改:

AppController.mm 中创建启动页图片

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[SDKWrapper getInstance] application:application didFinishLaunchingWithOptions:launchOptions];

    // Add the view controller's view to the window and display.
    float scale = [[UIScreen mainScreen] scale];
    CGRect bounds = [[UIScreen mainScreen] bounds];
    window = [[UIWindow alloc] initWithFrame:bounds];

    // 添加启动页:开始
    UIImageView *splashImageView = [[UIImageView alloc] initWithFrame:bounds];
    UIImage *ima = [UIImage imageNamed:@"iOSLaunch.png"];
    [splashImageView setImage:ima];
    [splashImageView setContentMode:UIViewContentModeScaleAspectFill];
    splashImageView.layer.zPosition = MAXFLOAT;
    [window addSubview:splashImageView];
    [window bringSubviewToFront:splashImageView];
    // 添加启动页:结束

    // ...

AppController.mm 中提供移除启动页的静态方法

/**
 移除启动页
 */
+ (void)removeSplashImageView {
    UIWindow *window = [[UIApplication sharedApplication].delegate window];
    for (UIView *view in window.subviews) {
        if ([view isKindOfClass:[UIImageView class]]) {
            [view removeFromSuperview];
        }
    }
}

在场景启动后移除启动页

比如:

在场景启动后的 start() 回调方法中移除

start() {
    if (CC_JSB) {
        if (cc.sys.os == cc.sys.OS_IOS) {
            jsb.reflection.callStaticMethod(
                "AppController",
                "removeSplashImageView"
            );
        }
    }
}

5赞

mkmkmk

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。