如何在Swift Xcode iOS中以编程方式延迟启动启动画面

时间:2017-04-07 10:47:03

标签: ios swift xcode splash-screen timedelay

我已将image放入imageView LaunchStoreyboard。如何以编程方式延迟图像的时间?

以下是 Launch Screen Guideline from Apple

以下是启动屏幕视图控制器的代码

import UIKit
class LaunshViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.delay(0.4)
    }

    func delay(_ delay:Double, closure:@escaping ()->()) {
        let when = DispatchTime.now() + delay
        DispatchQueue.main.asyncAfter(deadline: when, execute: closure)
    }
}

6 个答案:

答案 0 :(得分:33)

在AppDelegate类中添加一行代码 -

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        Thread.sleep(forTimeInterval: 3.0)
        // Override point for customization after application launch.
        return true
    }

答案 1 :(得分:9)

不建议将整个应用程序设置为等待状态。 如果应用程序需要在完成监视程序之前做更多的工作,可能会因为启动时间过长而终止应用程序。

相反,您可以执行此类操作来延迟启动屏幕。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        window = UIWindow(frame: UIScreen.main.bounds)
        window?.rootViewController = UIStoryboard(name: "LaunchScreen", bundle: nil).instantiateInitialViewController()
        window?.makeKeyAndVisible()

        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3) {
            self.window?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController()
        }
        return true
    }

答案 2 :(得分:8)

Swift 4.x

非常很好的做法,不要让应用程序进入睡眠状态!

启动应用程序应尽可能快,因此您不想使用“启动”屏幕延迟。

但是,您可以运行loop来代替接收器处理来自所有连接的输入源的数据,而无需休眠

这将延长启动屏幕的可见性时间。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    RunLoop.current.run(until: NSDate(timeIntervalSinceNow:1) as Date)

    return true
}

答案 3 :(得分:8)

Swift 5.x,iOS 13.x.x

AppDelegate 类中修改以下功能在 Swift 5.x / iOS 13.x.x 中不起作用。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    return true
}

相反,您将必须修改 SceneDelegate 类中的 场景 函数,如下所示。 它将延迟LaunchSceen 3秒。

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

    window?.rootViewController = UIStoryboard(name: "LaunchScreen", bundle: nil).instantiateInitialViewController()
    window?.makeKeyAndVisible()

    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3) {
        self.window?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController()
    }

    guard let _ = (scene as? UIWindowScene) else { return }
}

窗口变量应该已经在 SceneDelegate 类中,如下所示。

var window: UIWindow?

答案 4 :(得分:1)

创建一个ViewController并使用NSTimer来检测延迟时间。当计时器结束时,按下第一个UIViewcontroller。

在ViewDidLoad方法..

[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(fireMethod) userInfo:nil repeats:NO];


-(void)fireMethod
{
// push view controller here..
}

答案 5 :(得分:0)

您的应用肯定应该进入睡眠状态,因为它可能由于长时间无响应而被操作系统杀死。

如果您在启动屏幕上使用静态图像,对我有用的是在 LaunchScreen.storyboard 中使用该图像,然后在主控制器启动时以模态方式显示VC与主控制器 ViewDidAppear 中的背景图像相同(动画设置为false)。

然后,您可以使用逻辑来知道何时关闭启动屏幕(VC中将动画设置为false的 dismiss 方法)。

实际启动屏幕到显示相同屏幕的VC的过渡对我来说是难以察觉的。

PS :可能会多次调用 ViewDidAppear 方法,在这种情况下,您需要使用逻辑来第二次不在启动屏幕上显示VC。