在 iOS 中检测不活动(无用户交互)以显示单独的屏幕,如覆盖
Posted
技术标签:
【中文标题】在 iOS 中检测不活动(无用户交互)以显示单独的屏幕,如覆盖【英文标题】:Detecting inactivity (no user interaction) in iOS for showing separate Screen like an Overlay 【发布时间】:2019-04-22 16:40:25 【问题描述】:如何在 ios 应用中检测不活动或没有用户交互。用于显示单独的屏幕,如覆盖或屏幕保护程序。 通过以下链接 link that used to present screen overlay when the app became inactive 我可以在应用程序中显示屏幕保护程序。但是正常的关闭视图控制器代码无法关闭呈现的视图控制器。
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
我们在这方面面临的问题是。一旦呈现视图,我们就无法关闭或移除视图控制器。
【问题讨论】:
不是替换根视图控制器,而是在根视图控制器上模态显示屏幕保护程序屏幕。这样一旦用户触摸屏幕,您就可以关闭屏幕保护程序视图控制器。你又恢复了工作。 太棒了。非常感谢您的评论:) 抱歉我的问题,但是当您显示叠加层时,您会以特定方式降低显示亮度,还是什么?还是它唯一的“块设备节能”信息?你能解释一下吗? @DennyDog 不,不,它用于在呈现的视图控制器中显示细节。更像是一个小的单页广告。 @DennyDog 在像 iPhone X 这样的最新设备中,我们可以使用它来通过显示完全黑屏来节省能源,如你所说。我认为这也是一个好主意。 (特别是在 amoled 显示器中) 【参考方案1】:来自@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)
我面临的困难是在已经呈现的视图上方呈现叠加层或屏幕保护程序。这种情况,我们也在上面的解决方案中处理。 快乐编码:)
【讨论】:
您是否有机会发布所有部分如何在您的解决方案中组合在一起(AppDelegate.swift、主 ViewController 等)?我正在尝试做一些与您的情况非常相似的事情,但似乎无法将它们拼凑在一起。以上是关于在 iOS 中检测不活动(无用户交互)以显示单独的屏幕,如覆盖的主要内容,如果未能解决你的问题,请参考以下文章
子类 UIScrollView 检测按钮内的触摸,但对用户交互无响应