如何检测iOS UIViewController是否与

时间:2017-07-02 11:46:01

标签: ios swift uiviewcontroller touchesended

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

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

我试图覆盖控制器中的touchesEnded方法,但测试显示该方法从未被调用过。任何想法都会受到欢迎(快速3:)

2 个答案:

答案 0 :(得分:0)

Swift 3.0: -

需要在没有IBOutlet的情况下检测特定视图的触摸,然后选择该特定UIView然后转到Attributes Inspector -> View -> tag并将Integer设置为标记,无论需要什么。

enter image description here

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并将delegategestureRecognizers设置为scroll viewUITapGestureRecognizer。之后,只需为UITapGestureRecognizer创建操作,如下面的屏幕截图所示。 enter image description here

以编程方式添加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")
}

答案 1 :(得分:0)

最后,我通过对@ RAJAMOHAN-S建议的复合解决方案解决了这个问题。

  1. 我在控制器视图中添加了UIGestureRecognizer。使用此功能,如果视图中的任何位置有一个水龙头,我可以选择重置我的计时器。

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

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

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

    然后我实施了: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)

  4. 我对此并不完全满意,因为没有检测到点击键盘键,但我不认为这是这个应用程序的真正问题。

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