2016-12-20 1 views
0

Ich möchte den Telefondisplay dimmen, wenn meine App läuft und wenn während eines bestimmten Zeitraums (z. B. 10 Sek.) Keine Berührungsereignisse auftreten und den Bildschirm heller machen Bald wird irgendwo auf dem Bildschirm wieder angefasst.Dimmen Sie die Anzeige, wenn die App eine Weile nicht benutzt wurde.

Nach der Suche nach SO scheint es, als ob ich eine benutzerdefinierte UIApplication erstellen muss, um alle Berührungen zu verarbeiten. Unten ist mein Code so weit:

import UIKit 

@objc(MyApplication) 

class MyApplication: UIApplication { 

    override func sendEvent(_ event: UIEvent) { 

     var screenUnTouchedTimer = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(self.makeScreenDim), userInfo: nil, repeats: true); 

     // Ignore .Motion and .RemoteControl event simply everything else then .Touches 
     if event.type != .touches { 
      super.sendEvent(event) 
      return 
     } 

     // .Touches only 
     var restartTimer = true 
     if let touches = event.allTouches { 
      // At least one touch in progress? Do not restart timer, just invalidate it 
      self.makeScreenBright() 
      for touch in touches.enumerated() { 
       if touch.element.phase != .cancelled && touch.element.phase != .ended { 
        restartTimer = false 
        break 
       } 
      } 
     } 

     if restartTimer { 
      // Touches ended || cancelled, restart timer 
      print("Touches ended. Restart timer") 
     } else { 
      // Touches in progress - !ended, !cancelled, just invalidate it 
      print("Touches in progress. Invalidate timer") 
     } 

     super.sendEvent(event) 
    } 

    func makeScreenDim() { 
     UIScreen.main.brightness = CGFloat(0.1) 
     print("makeScreenDim") 
    } 

    func makeScreenBright() { 
     UIScreen.main.brightness = CGFloat(0.5) 
     print("makeScreenBright") 
    } 
} 

Der Druck sieht ungefähr so ​​aus aus:

makeScreenBright 
Touches in progress. Invalidate timer 
makeScreenBright 
Touches ended. Restart timer 
makeScreenDim 
makeScreenDim 
makeScreenDim 
makeScreenDim 
makeScreenDim 
... 

Wie Sie oben sehen können mit dem Code gibt es großes Problem, so scheint es, wie ich eine neue erschaffe Timer für jedes Berührungsereignis. Ich weiß nicht, wie man einen statischen (nur einen) Timer in der UIApplication erstellt.

Wie sollte ich nur einen Timer in der richtigen Weise implementieren?

(Ich verwende eine Iphone7, neueste Version von schnellen und Xcode)

+0

erstellen sie als Klasseneigenschaft, ungültig machen es mit neuen Timer – Tj3n

+0

@ Tj3n Dank zuerst, dann ersetzen, aber ich bin sehr neu zu schnellen könnte Ihnen ein Beispiel geben oder den Code oben – theAlse

+0

bearbeiten, wenn Sie Timer, Anruf müssen beenden 'screenUnTouchedTimer.invalidate()', ich sehe in Ihrem Code haben Sie dies nicht aufgerufen – Tj3n

Antwort

0

Sie haben die zuvor erstellte Timer irgendwo ungültig zu machen, sonst werden Sie Ihre beschriebene Verhalten bekommen.

Speichern Sie es bei jedem Aufruf von sendEvent in einer Eigenschaft, damit Sie beim nächsten Aufruf der Methode darauf zugreifen können.

class MyApplication: UIApplication { 

var screenUnTouchedTimer : Timer? 

override func sendEvent(_ event: UIEvent) { 

screenUnTouchedTimer?.invalidate() 
screenUnTouchedTimer = Timer ...... 
Verwandte Themen