2016-09-01 2 views
5

Ich habe einen Client, der erkennen möchte, wenn ein Benutzer ihren Bildschirm mit der ganzen Hand, wie ein High-Five klatscht. Ich vermute, dass Apple das nicht billigen wird, aber schauen wir mal davon weg.Wie erkennt man einen Bildschirm high-five

Ich benutze zwar einen Vier-Finger-Tap-Erkennung, aber das deckt es nicht wirklich. Der beste Ansatz wäre möglicherweise zu überprüfen, ob der Benutzer mindestens 70% des Bildschirms mit der Hand bedeckt, aber ich weiß nicht, wie das geht.

Kann mir hier jemand helfen?

Antwort

1

Sort von löste es. Proximity + Accelerometer funktioniert gut genug. Multitouch funktioniert nicht, da es Dinge ignoriert, die es nicht als Taps versteht.

import UIKit 
import CoreMotion 
import AVFoundation 

class ViewController: UIViewController { 
    var lastHighAccelerationEvent:NSDate? { 
     didSet { 
      checkForHighFive() 
     } 
    } 

    var lastProximityEvent:NSDate? { 
     didSet { 
      checkForHighFive() 
     } 
    } 

    var lastHighFive:NSDate? 


    var manager = CMMotionManager() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     //Start disabling the screen 
     UIDevice.currentDevice().proximityMonitoringEnabled = true 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(proximityChanged), name: UIDeviceProximityStateDidChangeNotification, object: nil) 

     //Check for acceloremeter 
     manager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue()) { (data, error) in 
      let sum = abs(data!.acceleration.y + data!.acceleration.z + data!.acceleration.x) 

      if sum > 3 { 
       self.lastHighAccelerationEvent = NSDate() 
      } 
     } 

     //Enable multitouch 
     self.view.multipleTouchEnabled = true 
    } 

    func checkForHighFive() { 
     if let lastHighFive = lastHighFive where abs(lastHighFive.timeIntervalSinceDate(NSDate())) < 1 { 
      print("Time filter") 
      return 
     } 

     guard let lastProximityEvent = lastProximityEvent else {return} 
     guard let lastHighAccelerationEvent = lastHighAccelerationEvent else {return} 

     if abs(lastProximityEvent.timeIntervalSinceDate(lastHighAccelerationEvent)) < 0.1 { 
      lastHighFive = NSDate() 
      playBoratHighFive() 
     } 

    } 

    func playBoratHighFive() { 
     print("High Five") 
     let player = try! AudioPlayer(fileName: "borat.mp3") 
     player.play() 
    } 

    func proximityChanged() { 
     if UIDevice.currentDevice().proximityState { 
      self.lastProximityEvent = NSDate() 
     } 
    } 
} 
0

Ich kann noch nichts kommentieren und dies ist vielleicht noch keine Antwort. Aber vielleicht könnten Sie 3 Tap Recognizer hinzufügen. Eine auf der Unterseite und 2 auf den Seiten oder eine andere Variation. Und lösen Sie ein Ereignis aus, wenn alle oder mindestens zwei von ihnen auf einmal angezapft werden.

0

Sie können die Fingeranzahl mit der Multi-Touch-Ereignisbehandlung erkennen. check this answer

2

Sie den Beschleunigungsmesser verwenden könnte, die Auswirkungen einer Hand & untersuchen die Frontkamera-Feed finden Sie einen entsprechenden dunklen Rahmen auf Grund der Hand, die für die Kamera *

* N. B. zu erkennen eine menschliche Hand ist vielleicht nicht groß genug, um die Frontkamera auf einem iPhone zu decken 6+

Verwandte Themen