【问题标题】:iOS Swift splash screen from Storyboard来自 Storyboard 的 iOS Swift 闪屏
【发布时间】:2018-01-25 16:28:33
【问题描述】:

在我的 iPhone 应用程序中,需要在加载第一页之前显示一个启动屏幕(显示公司徽标和一些信息)2-3 秒。

应用程序还需要决定应在此处加载哪个页面作为第一页(根据用户的“初始设置完成”级别)。

我使用“Swift”作为编程语言,使用“Universal StoryBoard”来设计界面...

我已选择 Main.storyboard 作为启动屏幕文件。在 ViewController 类中实现了以下逻辑

override func viewDidAppear(animated: Bool) {
    NSLog("Before sleep...")
    sleep(2)
    NSLog("After sleep...")

    self.controllNavigation()
}

func controllNavigation() -> Void {

    let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

    var nextViewController  

    if (Condition1)
    {
        nextViewController = storyBoard.instantiateViewControllerWithIdentifier("MainMenu") as! MainMenuViewController
    }
    else
    {
        nextViewController = storyBoard.instantiateViewControllerWithIdentifier("UserSetup") as! UserSetupViewController
    }

    self.presentViewController(nextViewController, animated: true, completion: nil)

}

一切正常,但在等待sleep(2) 时,会发生刷新页面之类的事情。我不确定这是否是最好的方法。喜欢听想法。谢谢

【问题讨论】:

  • 你不是一个取悦用户的人,是吗... 2-3 秒的停顿?让用户进来!或者您将前往 1 星评论。用户在任何时候都不想查看您的公司徽标或信息,他们可能想使用您的应用。
  • 嗨,丹尼尔,是的,我明白这一点。但这就是客户的要求。他们的 Android 和 Windows 应用程序就是这样做的。在 IOS 应用中需要相同的功能。
  • 您为什么不按应有的方式使用启动屏幕,以免刺激用户,并且在应用加载后立即消失?
  • 嗨,长弓 8,可以使用。但需要实现该逻辑(以决定应首先加载哪个页面)。还需要实现 2 秒的延迟。
  • 您应该发现自己是一个更受人尊敬的客户。别忘了,客户不是公司,而是用户 :) /rant over/ 请原谅我,我知道我对你没有任何帮助,我只是为出色的用户体验而疯狂。

标签: ios iphone xcode swift


【解决方案1】:

在应用程序委托中使用延迟而不是 viewController 的 viewDidAppear。 用作:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    NSLog("Before Sleep");
    sleep(2);
    NSLog("After sleep");
    return true
}

这样做会让您的启动画面停留到 2 秒,然后您可以在视图控制器中使用以下内容:

override func viewDidAppear(animated: Bool) {
   self.controllNavigation()
}

希望这会有所帮助:)

【讨论】:

  • 不要使用 sleep(3),它会冻结主线程。使用performSelector: afterDelay:
  • 是的@KostiantynKoval,他想在启动屏幕上停留2秒,所以他需要冻结主线程。他不能使用执行选择器,因为它会直接将他带到 ViewController。
  • 当然有适当的方法可以做到这一点,例如你可以创建一个 UIViewController 来显示你的启动屏幕,然后你可以在 2 秒后推送你想要的 viewController,但是使用 sleep 将不会有额外的开销。
  • @KostiantynKoval 不适用于非 objc Swift 方法。
  • 睡眠是一个非常糟糕的决定,因为它会让你的应用死机。我更愿意用启动画面的图像显示 UIViewController。这样您就可以在以后添加额外的动画或 smt else。您也可以将此解决方案用于延迟 dispatch_after(0.1, dispatch_get_main_queue(), { // your function here })
【解决方案2】:

我遇到了类似的答案,其中提到了sleep(),但是它似乎不适合使用,因为它阻塞了主线程。

如果您在 Xcode 7.2 中使用默认的 LaunchScreen.storyboard,我想出了这个解决方案:

func showLaunchScreen() {
    let launchScreen = UIStoryboard(name: "LaunchScreen", bundle: nil)
    let launchView = launchScreen.instantiateInitialViewController()
    self.view.addSubview(launchView!.view)

    let timeDelay = dispatch_time(DISPATCH_TIME_NOW, Int64(2 * Double(NSEC_PER_SEC)))
    dispatch_after(timeDelay, dispatch_get_main_queue()) {
        UIView.animateWithDuration(0.5, animations: { _ in
            launchView?.view.alpha = 0.0
            }) { _ in
                launchView!.view.removeFromSuperview()
        }
    }

这将使启动屏幕再显示 2 秒,然后在 0.5 秒内淡出。您可以调用其他函数来在完成处理程序中加载“默认”VC。

【讨论】:

    【解决方案3】:

    我已经解决了这个问题:

    在我的项目中,我将所需的启动故事板(在我的情况下为 Splash.storyboard)设置为 Default Screen -> Targets/(您的目标)/ Info/ Launch Screen Interface File Base Name。

    Field on Project Settings

    完成后,您可以在 AppDelegate.swift 上的方法 "func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {} 上插入逻辑。

    如果你想编写干净的代码,你可以在另一个类中插入所有导航相关的方法,并从 AppDelegate.swift 中调用它们。

    使用此解决方案,启动画面仅在所需时间可见,完成后,您可以导航到所需的屏幕。

    【讨论】:

      【解决方案4】:

      Swift 4 更新 100% 工作

      只需写一行代码 Thread.sleep(forTimeInterval: 3.0) didfinishLauching.... 的方法中在appdelegate 类中。

      示例

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-08
        • 1970-01-01
        • 2016-06-03
        • 2019-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-01
        相关资源
        最近更新 更多