gpt4 book ai didi

ios - 在 iOS 中检测不活动(无用户交互)以显示单独的屏幕,如覆盖

转载 作者:行者123 更新时间:2023-12-01 19:42:21 28 4
gpt4 key购买 nike

如何在 iOS 应用中检测不活动或没有用户交互。用于显示单独的屏幕,如覆盖或屏幕保护程序。
通过以下链接
link that used to present screen overlay when the app became inactive
我可以在应用程序中显示屏幕保护程序。但是正常的关闭 View Controller 代码无法关闭呈现的 View Controller 。

 we are presenting the custom overlay using

// The callback for when the timeout was fired.
func applicationDidTimout(notification: NSNotification) {

let storyboard = UIStoryboard(name: "MyStoryboard", bundle: nil)
let vc =
storyboard.instantiateViewControllerWithIdentifier("myStoryboardIdentifier")
UIApplication.shared.keyWindow?.rootViewController = vc
}

我们在这方面面临的问题是。一旦呈现 View ,我们就无法关闭或删除 View Controller 。

最佳答案

来自@Prabhat Kesara 的评论和@Vanessa Forney 在帮助链接中的回答。我提供了以下解决方案,它工作正常。如果有人提出这样的要求,他们可以使用这个

import UIKit
import Foundation

extension NSNotification.Name {
public static let TimeOutUserInteraction: NSNotification.Name = NSNotification.Name(rawValue: "TimeOutUserInteraction")
}

class UserInterractionSetup: UIApplication {

static let ApplicationDidTimoutNotification = "AppTimout"

// The timeout in seconds for when to fire the idle timer.

let timeoutInSeconds: TimeInterval = 1 * 60 //5 * 60 //

var idleTimer: Timer?

// Listen for any touch. If the screen receives a touch, the timer is reset.

override func sendEvent(_ event: UIEvent) {

super.sendEvent(event)


if idleTimer != nil {

self.resetIdleTimer()

}

if let touches = event.allTouches {

for touch in touches {

if touch.phase == UITouch.Phase.began {

self.resetIdleTimer()

}

}

}

}


// Resent the timer because there was user interaction.

func resetIdleTimer() {

if let idleTimer = idleTimer {

// print("1")

let root = UIApplication.shared.keyWindow?.rootViewController

root?.dismiss(animated: true, completion: nil)

idleTimer.invalidate()

}


idleTimer = Timer.scheduledTimer(timeInterval: timeoutInSeconds, target: self, selector: #selector(self.idleTimerExceeded), userInfo: nil, repeats: false)

}

// If the timer reaches the limit as defined in timeoutInSeconds, post this notification.

@objc func idleTimerExceeded() {

print("Time Out")
NotificationCenter.default.post(name:Notification.Name.TimeOutUserInteraction, object: nil)

let screenSaverVC = UIStoryboard(name:"ScreenSaver", bundle:nil).instantiateViewController(withIdentifier:"LandingPageViewController") as! LandingPageViewController

if let presentVc = TopMostViewController.sharedInstance.topMostViewController(controller: screenSaverVC){


let root: UINavigationController = UIApplication.shared.keyWindow!.rootViewController as! UINavigationController

if let topView = root.viewControllers.last?.presentedViewController {

topView.dismiss(animated: false) {

root.viewControllers.last?.navigationController?.present(presentVc, animated: true, completion: nil)

}

}else if let topViewNavigation = root.viewControllers.last {

topViewNavigation.navigationController?.present(presentVc, animated: true, completion: nil)



}

}

}

}

我面临的困难是在已经呈现的 View 上方呈现叠加层或屏幕保护程序。这种情况,我们也在上面的解决方案中处理。
快乐编码:)

关于ios - 在 iOS 中检测不活动(无用户交互)以显示单独的屏幕,如覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53389572/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com