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-сообщение) или когда пользователь выходит из приложения и начинает переход в фоновое состояние.
"Если вы не хотите, чтобы ваше приложение оставалось в фоновом режиме после его выхода, вы можете явно отказаться от фоновой модели выполнения, добавив ключ UIApplicationExitsOnSuspend в файл Info.plist вашего приложения и установив его значение в YES.
Когда приложение отключается, оно циклически переключается между неработающим, неактивным и активным состояниями и никогда не переходит в фоновые или приостановленные состояния.
Когда пользователь нажимает кнопку "Домой", чтобы выйти из приложения, вызывается applicationWillTerminate: метод делегата приложения, и у приложения есть приблизительно пять секунд для очистки и выхода, прежде чем оно завершается и возвращается в неработающее состояние.