如何检测 iOS UIViewController 是否被交互或被触摸

How to detect if iOS UIViewController is being interacted with or touched

我有一个特定的 UIViewController,我想阻止 iOS 完成的 idleTimer 处理。我知道我可以设置:UIApplication.shared.isIdleTimerDisabled = true 但是,我希望能够设置一个定时器,在一段固定的时间后重新启用正常的系统空闲定时器处理,这样我就可以将屏幕保持在最短的时间内。该应用程序的性质使您可以打开一个视图并将其使用 reference/reading 很长时间。

关键点是我希望每次用户触摸屏幕或与设备交互时计时器都重新启动。所以我需要能够检测用户是否做了任何事情,这样我就可以休息了。

我试图覆盖控制器中的 touchesEnded 方法,但测试表明该方法从未被调用。欢迎任何想法(在 swift 3:)

Swift 3.0 :-

需要在没有 IBOutlet 的情况下检测特定视图的触摸,然后 select 那个特定的 UIView 然后转到 Attributes Inspector -> View -> tag 并将 Integer 设置为标签需要。

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    let touch = touches.first

    let tag = touch?.view?.tag
    if tag == 1{
        //Do More....
    }else{
    //......
    }

}

如果您需要与 IBOutlet 核实,请按以下步骤操作。

这里,@IBOutlet var diamondView: UIView!

if touch?.view == self.diamondView{

    //Do More....
}else{
//......
}

更新:滚动视图

如果您需要检测滚动视图的触摸,请使用 UITapGestureRecognizer。通过故事板拖放到 UIViewController 的至,并将 scroll viewdelegategestureRecognizers 设置为 UITapGestureRecognizer。之后,只需为 UITapGestureRecognizer 创建操作,如下图所示。

以编程方式添加 UITapGesture :-

下面的代码也可以正常工作,而不需要像上面的截图那样做。

@IBOutlet var scrollView: UIScrollView!

override func viewDidLoad() {
    super.viewDidLoad()

    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.actionTapOnScrollView(sender:)))
    self.scrollView.addGestureRecognizer(tapGesture)


}

@objc private func actionTapOnScrollView(sender:UITapGestureRecognizer){
    print("user Touched")
}

最后我根据@RAJAMOHAN-S 的建议做了一个复合解决方案来解决这个问题。

  1. 我在控制器视图中添加了一个 UIGestureRecognizer。如果在视图中的任何地方有一个点击,我可以使用它来重新设置我的计时器。

    view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(viewTappedHandler)))

    viewTappedHandler方法设置我需要的定时器。

  2. 我通过将 UIScrollViewDelegate 协议添加到控制器的 class 声明,使我的 UIController 成为 UIScrollView 的委托。

    然后我执行:scrollViewWillBeginDragging(_ scrollView: UIScrollView) 并再次设置时间。这会拾取滚动视图中的移动,而点击手势不会拾取。

  3. 最后,因为我的滚动视图包含其他可以打开键盘的视图,所以我还需要注册键盘通知并再次设置每次出现的计时器。

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidShow), name: .UIKeyboardDidShow, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidHide), name: .UIKeyboardDidHide, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidChange), name: .UIKeyboardDidChangeFrame, object: nil)

我对此不太满意,因为未检测到敲击键盘按键,但我不认为这会成为此应用的真正问题。

PS 我还删除了键盘上的观察者并清除了 deinit 上的计时器。