swift3如何在应用更改为后台状态时更改屏幕

时间:2017-05-24 13:26:26

标签: ios swift swift3 uibackgroundmode

在swift3中

我想在应用处于后台状态时更改屏幕以隐藏原始屏幕。

例如,如果您在应用程序运行时按住主屏幕按钮两次,屏幕将更改为其他屏幕。

我想将屏幕设置为更改为LaunchScreen。

感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

这是常见的情况,我们希望在应用程序处于堆叠状态时,在进入BG或覆盖应用程序屏幕时避免使用iOS进行屏幕截图。

以下是我正在做的事情:

class AppDelegate: UIResponder, UIApplicationDelegate {

  var window: UIWindow?
  private var appCoverWindow: UIWindow?
  private var appCoverVC: UIViewController?

  func applicationDidBecomeActive(_ application: UIApplication) {
    if appCoverWindow != nil {
        appCoverWindow!.isHidden = true
        appCoverWindow!.rootViewController = nil
        appCoverWindow = nil
        appCoverVC = nil
    }
  }

  func applicationWillResignActive(_ application: UIApplication) {
    appCoverVC = rootViewController().storyboard!.instantiateViewController(withIdentifier: "AppCoverVCId") as! AppCoverViewController
    appCoverWindow = UIWindow(frame: UIScreen.main.bounds)
    let existingTopWindow = UIApplication.shared.windows.last
    appCoverWindow!.windowLevel = existingTopWindow!.windowLevel + 1
    appCoverVC!.view.frame = appCoverWindow!.bounds
    appCoverWindow!.rootViewController = appCoverVC!
    appCoverWindow!.makeKeyAndVisible()
  }

  class func appLaunchImage() -> UIImage? {
    //this method will return LaunchImage
    let launchImageNames = Bundle.main.paths(forResourcesOfType: "png", inDirectory: nil).filter { (imageName) -> Bool in
        return imageName.contains("LaunchImage")
    }

    for imageName in launchImageNames {
        guard let image = UIImage(named: imageName) else { continue }

        // if the image has the same scale and dimensions as the current device's screen...
        if (image.scale == UIScreen.main.scale) && (image.size.equalTo(UIScreen.main.bounds.size)) {
            return image
        }
    }
    return nil
  }
}

我们可以直接使用UIWindow,而不是使用UIViewController来覆盖应用,但如果在转到BG时出现键盘,则可能会出现问题。

以下是AppCoverViewController.swift
(它在故事板中有一个XIB,有一个全屏UIImageView

class AppCoverViewController: BaseViewController {

  @IBOutlet weak var bgImageView: UIImageView!//full screen image view

  override func viewDidLoad() {
    super.viewDidLoad()
    if let image = AppDelegate.appLaunchImage() {
        bgImageView.image = image
    }
  }

  override func deviceOrientationDidChange() {
    if let image = AppDelegate.appLaunchImage() {
        bgImageView.image = image
    }
  }
}

此课程还负责设备轮换。

答案 1 :(得分:0)

“如果您不希望应用程序在退出时保留在后台,则可以通过将UIApplicationExitsOnSuspend键添加到应用程序的Info.plist文件并将其值设置为YES来明确选择退出后台执行模型。

当应用程序选择退出时,它会在非运行状态,非活动状态和活动状态之间循环,并且永远不会进入后台或暂停状态。

当用户点击Home按钮退出应用程序时,将调用应用程序委托的applicationWillTerminate:方法,并且应用程序有大约五秒钟的时间来清理并退出,然后终止并返回到未运行状态。 “ 小号

答案 2 :(得分:0)

试试这个:

func applicationDidEnterBackground(_ application: UIApplication) {

    let imageView = UIImageView(frame: self.window!.bounds)
    imageView.tag = 1001
    imageView.image = UIImage(named: "") //your image goes here

    UIApplication.shared.keyWindow?.subviews.last?.addSubview(imageView)
 }

func applicationWillEnterForeground(_ application: UIApplication) {

    if let imageView : UIImageView = UIApplication.shared.keyWindow?.subviews.last?.viewWithTag(101) as? UIImageView {
        imageView.removeFromSuperview()
    }

}

答案 3 :(得分:0)

在AppDelegate中添加此功能。

func applicationWillResignActive(_ application: UIApplication) {
    // Change the view to show what you want here.
}
  

调用此方法可让您的应用知道它即将移动   从活动状态到非活动状态。这可能发生在某些类型的   暂时中断(例如来电或短信)   消息)或当用户退出应用程序并开始转换时   到了背景状态。

来源:https://developer.apple.com/reference/uikit/uiapplicationdelegate/1622950-applicationwillresignactive