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)
erstellen sie als Klasseneigenschaft, ungültig machen es mit neuen Timer – Tj3n
@ Tj3n Dank zuerst, dann ersetzen, aber ich bin sehr neu zu schnellen könnte Ihnen ein Beispiel geben oder den Code oben – theAlse
bearbeiten, wenn Sie Timer, Anruf müssen beenden 'screenUnTouchedTimer.invalidate()', ich sehe in Ihrem Code haben Sie dies nicht aufgerufen – Tj3n