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

Xco*_*ngi 12 xcode timedelay splash-screen ios swift

我已经把一个image在imageView中LaunchStoreyboard.我怎样才能以编程方式延迟图像的时间?任何帮助都会非常值得一提.

这是Apple的Launch Screen Guideline

这是Launch Screen View控制器的代码

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

Jac*_*ack 41

在AppDelegate类中放入一行代码 -

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

  • 这是一个非常糟糕的hack,不是正确的方法。@yoowim的答案也是一个hack,但是是达到相同目的的好方法。苹果否则不提供任何方法。 (3认同)

osc*_*car 15

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

相反,你可以做这样的事情来推迟发布屏幕.

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
    }
Run Code Online (Sandbox Code Playgroud)


小智 13

斯威夫特4.x

这是不是把你的应用程序睡眠好习惯!

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

但是,除了休眠之外,您还可以运行a,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
}
Run Code Online (Sandbox Code Playgroud)

  • 警告:日期/ NSDate可能会发生leap秒,时区更改以及冬夏时间调整。因此,尝试等待1秒有时会变成等待1小时+1秒。因此,请勿像这样使用`RunLoop`,最好将其与[`addTimer:forMode:`](https://developer.apple.com/documentation/foundation/runloop/1418468-add)结合使用。 (2认同)

小智 11

斯威夫特 5.x,iOS 13.xx

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

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

相反,您必须修改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 }
}
Run Code Online (Sandbox Code Playgroud)

该窗口变量应该已经有在SceneDelegate像下面的类。

var window: UIWindow?
Run Code Online (Sandbox Code Playgroud)