2017-07-02 6 views
0
interagiert oder berührt wird?

Ich habe einen bestimmten UIViewController, für den ich die von iOS durchgeführte IdleTimer-Verarbeitung blockieren möchte. Ich weiß, dass ich einstellen kann: UIApplication.shared.isIdleTimerDisabled = true Allerdings möchte ich in der Lage sein, einen Timer zu setzen, um die normale System-Idle-Timer-Verarbeitung nach einer festen Zeit wieder zu aktivieren, damit ich den Bildschirm für eine minimale Zeit anbehalten kann . Die Art der App ist so konzipiert, dass Sie eine Ansicht öffnen und sie für längere Zeit als Referenz/Lese verwenden können.Wie erkennt man, ob iOS UIViewController mit

Der Schlüsselpunkt ist, dass ich den Timer jedes Mal neu starten soll, wenn der Benutzer den Bildschirm berührt oder mit dem Gerät interagiert. Ich muss also erkennen können, ob der Benutzer etwas unternimmt, damit ich die Zeit ausruhen kann.

Ich habe versucht, die touchsEnded-Methode in der Steuerung zu überschreiben, aber Tests zeigten, dass die Methode nie aufgerufen wird. Irgendwelche Ideen wäre zu begrüßen (in schnellen 3 :)

+0

Müssen Sie die Berührung der bestimmten 'UIView' oder' detect' Berührung des Bildschirms erkennen, wenn die App 'Background App Refresh' verwendet? –

+0

Ich muss Touch nur für Bildschirm erkennen, nicht Hintergrund aktualisieren. Ich brauche es auch im Code. Ich möchte für die gesamte Controller-Ansicht (und damit die Sub-Views) erkennen, nicht nur eine bestimmte Ansicht. – zkon

Antwort

0

Swift 3.0: -

Need ohne IBOutlet Berührung der jeweiligen Ansicht zu erfassen, wählen Sie dann, dass bestimmte UIView dann gehe zu Attributes Inspector -> View -> tag und setzen Integer als Tag was auch immer brauchen.

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{ 
    //...... 
    } 

} 

Wenn Sie mit IBOutlet überprüfen müssen, dann tun wie als unten. Hier

, @IBOutlet var diamondView: UIView!

if touch?.view == self.diamondView{ 

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

Update: Scroll-Ansicht

Wenn Sie Berührung der Bildlaufansicht erkennen, müssen dann UITapGestureRecognizer verwenden. Nach Storyboard ziehen und ablegen auf UIViewController und delegate und gestureRecognizers für scroll view auf UITapGestureRecognizer setzen. Danach erstellen Sie einfach eine Aktion für UITapGestureRecognizer wie unten Screenshot. enter image description here

Hinzufügen UITapGesture Programmatically: -

Auch unter Code funktioniert gut, ohne wie oben Screenshot tun.

+0

Ich habe versucht, 'touchesBegan' und' touchesEnded' zu überschreiben, aber sie werden nicht für den Controller aufgerufen. Die Hauptansicht innerhalb der Controller-Ansicht ist ein 'UIScrollView', der den größten Teil des Fensters dominiert. – zkon

+0

@zkon, siehe meine aktualisierte Antwort :) –

+0

Danke für Ihre Antwort @ RAJAMOHAN-S. Ich hatte auf etwas niedrigeres Niveau gehofft (ohne Sub-Classing). Meine Antwort auf diese Fragen sagt dir, wie ich es letztendlich geschafft habe. – zkon

0

Am Ende löste ich dies, indem ich eine zusammengesetzte Lösung zu was @ RAJAMOHAN-S vorgeschlagen.

  1. Ich habe eine UIGestureRecognizer auf der Controller-Ansicht hinzugefügt. Mit diesem konnte ich aufheben, wenn irgendwo in der Ansicht ein Tap war und somit meinen Timer zurücksetzen.

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

    Die viewTappedHandler Verfahren den Timer I benötigt wird.

  2. Ich machte meine UIController einen Delegaten für die UIScrollView durch Hinzufügen der UIScrollViewDelegate Protokoll der Klasse Deklaration der Steuerung.

    Dann habe ich implementiert: scrollViewWillBeginDragging(_ scrollView: UIScrollView) und wieder die Zeit einstellen. Dies nimmt Bewegungen in der Bildlaufansicht auf, die die Tippgeste nicht aufnimmt.

  3. Da meine Bildlaufansicht andere Ansichten enthielt, die die Tastatur öffnen können, musste ich mich auch für Tastaturbenachrichtigungen anmelden und den Zeitgeber für jedes Auftreten erneut festlegen.

    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)

Ich bin nicht ganz zufrieden mit diesem als auf den Tasten auf der Tastatur tippt nicht erkannt wird, aber ich erwarte nicht ein echtes Problem für diese App sein.

PS Ich entfernte auch die Beobachter auf der Tastatur und löschen Sie den Timer auf deinit.

Verwandte Themen