2017-07-02 44 views
0

我有一个特定的UIViewController,我想阻止iOS完成的idleTimer处理。我知道我可以设置:UIApplication.shared.isIdleTimerDisabled = true 但是,我希望能够设置定时器以在固定的时间量后重新启用正常的系统空闲定时器处理,因此我可以将屏幕保持最少的时间。该应用程序的性质是这样的,你可以打开一个视图,并将其用于长时间的参考/阅读。如何检测iOS UIViewController是否与交互或触摸

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

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

+0

当应用程序使用“后台应用程序重新启动”时,您是否需要检测特定“UIView”或“检测触摸”屏幕? –

+0

我只需要检测屏幕触摸,而不是后台刷新。我也需要它在代码中完成。我想检测整个控制器的视图(以及扩展的子视图),而不仅仅是一个特定的视图。 – zkon

回答

0

雨燕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并设置delegategestureRecognizersscroll 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") 
} 
+0

我试着重写'touchesBegan'和'touchesEnded',但是他们没有被他的控制器调用。控制器视图内的主视图是控制大部分窗口的“UIScrollView”。 – zkon

+0

@zkon,看我更新的回答:) –

+0

感谢您的回答@ RAJAMOHAN-S。我希望有更低的水平(这不涉及分类)。我对这个问题的回答告诉你我是如何做到的。 – zkon

0

最后,我通过做一个@ RAJAMOHAN-S建议的综合解决方案来解决这个问题。

  1. 我在控制器视图中添加了UIGestureRecognizer。使用这个,我可以拿起如果有一个水龙头在视图中的任何地方,并因此重置我的计时器。

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

    viewTappedHandler的方法来设定我所需要的计时器。

  2. 我加入了UIScrollViewDelegate协议控制器的类的声明让我UIControllerUIScrollView的委托。

    然后我执行: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