swift3 как изменить экран, когда приложение переходит в фоновый режим

В swift3

Я хочу изменить экран, чтобы скрыть исходный экран, когда приложение находится в фоновом режиме.

Например, если вы дважды нажмете кнопку "Домой" во время работы приложения, экран изменится на другой.

Я хочу настроить экран на LaunchScreen.

Спасибо за помощь.

4 ответа

Попробуй это:

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()
    }

}

Это распространенный сценарий, когда мы хотим избежать снимков экрана с помощью iOS при переходе на BG или прикрывать экраны приложений, когда приложение находится в стеке.

Вот что я делаю:

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
    }
  }
}

Этот класс также заботится о вращении устройства.

Добавьте эту функцию в ваш AppDelegate.

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

Этот метод вызывается, чтобы сообщить вашему приложению, что оно собирается перейти из активного в неактивное состояние. Это может произойти для определенных типов временных прерываний (таких как входящий телефонный звонок или SMS-сообщение) или когда пользователь выходит из приложения и начинает переход в фоновое состояние.

Источник: https://developer.apple.com/reference/uikit/uiapplicationdelegate/1622950-applicationwillresignactive

"Если вы не хотите, чтобы ваше приложение оставалось в фоновом режиме после его выхода, вы можете явно отказаться от фоновой модели выполнения, добавив ключ UIApplicationExitsOnSuspend в файл Info.plist вашего приложения и установив его значение в YES.

Когда приложение отключается, оно циклически переключается между неработающим, неактивным и активным состояниями и никогда не переходит в фоновые или приостановленные состояния.

Когда пользователь нажимает кнопку "Домой", чтобы выйти из приложения, вызывается applicationWillTerminate: метод делегата приложения, и у приложения есть приблизительно пять секунд для очистки и выхода, прежде чем оно завершается и возвращается в неработающее состояние.

Другие вопросы по тегам