在 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 检测按钮内的触摸,但对用户交互无响应

iOS 检测购买的版本以更改功能

如何检测Android中的用户不活动

Swift - 使用计时器检测用户不活动,然后在 4 分钟后显示警报以提示用户是不是仍然存在

如何在 FSCalendar swift 中禁用用户交互?

通过Swift中的触摸检测应用程序何时处于活动状态或非活动状态[重复]