【问题标题】:Execute code in Launch Screen在启动屏幕中执行代码
【发布时间】:2015-02-22 20:58:09
【问题描述】:

Xcode 允许通过 Interface Builder 在.xib 文件中创建启动屏幕。是否可以使用 xib 执行一些代码,就像在通常的视图控制器中一样?如果我们可以在应用程序启动时设置不同的文本/图像/等,那就太好了。

【问题讨论】:

  • 想想为什么会出现启动屏幕。
  • @Zaph 我明白为什么。但另一方面,如果我只想显示已定义列表中的随机问候语,iOS 将无需任何操作。
  • 您总是可以添加一个初始视图控制器,该控制器显示与启动屏幕相同的图像,并添加您的问候。
  • @Dmitriy,我见过很多应用程序这样做,它们的启动屏幕会根据一天更改图像和文本,问候消息也会更改,我只是不知道他们是如何做到的。
  • 在下面查看我的答案。 :)

标签: ios xcode user-interface xib


【解决方案1】:

语言:Swift 4

您好,这里有一个使用 xib 启动屏幕的解决方案。

  1. 将名为 LaunchView 的新类添加到您的项目中,然后您将在项目中拥有一个新文件 LaunchView.swift。

  2. 转到 LauchImage.xib 将类设置为 LaunchView(这是您的新类)。

  3. 在 LaunchView.swift 添加一些代码,并阅读一些信息。这是我在启动屏幕上显示应用版本的代码。

class LaunchView: UIView {
    
    lazy var versionLabel: UILabel = {
        let label = Factory.label(style: LabelStyle.custom(font: .regular, size: 10, color: .other(ColorUtility.versionGray)), mutiLine: false, textAlignment: .center)
        label.text = "ver \(Constants.appVersion)"
        return label
    }()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        nibSetup()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        nibSetup()
    }

    private func nibSetup() {
        addSubview(versionLabel)
        versionLabel.snp.makeConstraints { (make) in
            make.bottom.equalTo(safeAreaLayoutGuide.snp.bottom).offset(-6)
            make.centerX.equalToSuperview()
        }
    }
    
}

【讨论】:

    【解决方案2】:

    我也在努力实现这一目标。我尝试了以下方法,它会延迟几秒钟,但对我有用。

    • 在项目设置中创建和设置启动屏幕。
    • 使用自定义类 (SplashViewController) 创建一个视图控制器,并将其设置为情节提要中的起始视图控制器。
    • 在其中添加一个容器视图并将其设置为全屏。
    • 将嵌入式 segue 设置为情节提要参考。
    • 从属性检查器中选择 Storyboard Reference 并在 StoryBoard 属性中设置启动屏幕。
    • 在 SplashViewController 中做任何你想做的事(播放动画或会话检查等)并在完成后执行 segue。

    希望对你有帮助!

    【讨论】:

      【解决方案3】:

      我试图在这里做同样的事情。 :)

      我真的很喜欢其中一些应用程序,它们在每次应用程序启动时都会做一些动态的问候文字和图像,例如“你今天看起来不错!”,“今天是星期五,美好的一天”等,非常可爱。

      我做了一些搜索,下面是如何做到的: (我的代码是 XCode 7,带有一个 launchscreen.xib 文件)

      class AppDelegate: UIResponder, UIApplicationDelegate {
      
          var window: UIWindow?
          var customizedLaunchScreenView: UIView?
      
          func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
      
              // Override point for customization after application launch.
              application.statusBarHidden = true
      
              // customized launch screen
              if let window = self.window {
                  self.customizedLaunchScreenView = UIView(frame: window.bounds)
                  self.customizedLaunchScreenView?.backgroundColor = UIColor.greenColor()
      
                  self.window?.makeKeyAndVisible()
                  self.window?.addSubview(self.customizedLaunchScreenView!)
                  self.window?.bringSubviewToFront(self.customizedLaunchScreenView!)
                  UIView.animateWithDuration(1, delay: 2, options: .CurveEaseOut,
                                             animations: { () -> Void in
                                              self.customizedLaunchScreenView?.alpha = 0 },
                                             completion: { _ in
                                              self.customizedLaunchScreenView?.removeFromSuperview() })
              }
      
              return true
          }
      
      // other stuff ...
      
      }
      

      在此处的 customizedLaunchScreenView 中执行您想要显示的任何内容,文本、图像、动画等。

      在启动结束时,只需使用更改 alpha 值淡出这个自定义的 UIView,然后将其完全移除。

      这有多酷?我绝对喜欢它!

      希望对你有帮助。

      【讨论】:

      • didFinishLaunchingWithOptions 在应用程序完成加载时调用,因此在显示启动屏幕之后。我理解为什么人们会在进入应用程序之前需要自定义过渡,但这绝不是自定义启动屏幕。
      • 所以这不是问题的确切答案.. 但它很有帮助.. 一个很好的解决方法
      【解决方案4】:

      不,这是不可能的。

      当显示启动屏幕时,您的应用将处于加载状态。

      在显示启动屏幕时,即使- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 也不会完全执行。

      所以很明显,您对您的应用没有任何访问权限,因此此时您无法执行任何代码。

      【讨论】:

      • 感谢您的回复。所以启动 xib 由 iOS 加载,而不是由应用程序加载。可悲的是,因为我考虑过在不同的发布时显示不同的问候。
      • @Dmitriy:遗憾的是,这是不可能的,只需启动图像被启动 xib 替换。唯一的好处是,你可以在上面设计。但不能执行任何代码。
      • 有可能,我刚刚想通了。在下面检查我的答案。
      • @RainCast:不,这是不可能的。您无法在启动屏幕 xib 中执行任何代码。您发布的答案没有回答问题(OP 询问如何在启动屏幕 xib 中执行代码)。您编写的代码也是不必要的。您提到的效果可以通过简单地设计类似于启动屏幕 xib 的初始视图控制器(在情节提要中)并在该视图控制器类中编写动画逻辑来实现。完成动画后,只需以编程方式转到下一页。
      • @MidhunMP,我现在明白你的意思了。在这种情况下,我的回答解决了这一点 - “如果我们可以在应用程序启动时设置不同的文本/图像/等,那就太好了”,这就是 OP 想要实现的目标。你的回答也很棒,谢谢分享。
      猜你喜欢
      • 1970-01-01
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多