2017-03-17 1 views
1

Ich erstelle eine Anwendung, die ein Foto erfassen wird und es zum Zeitpunkt der Fotoaufnahme auf der Grundlage der Gyroskop Daten umorientieren.Capturing Gyroskop Daten genau in dem Moment der Fotoaufnahme

Ich habe Funktionen erstellt in die Kreiseldaten vom Telefon zu erfassen:

startUpdates() 

und die Daten in der Aufnahme zu beenden:

stopUpdates() 

ich versuchte, indem diese in die UIImagePickerController:

if UIImagePickerController.isSourceTypeAvailable(.camera) { 
     guard ptInitials.text != "" else { 
      missingIdentifier(text: "Please add an identifier prior to taking a photo") 
      return} 
     startUpdates() 
     imagePicker = UIImagePickerController() 
     imagePicker.delegate = self 
     imagePicker.allowsEditing = false 
     imagePicker.sourceType = UIImagePickerControllerSourceType.camera 
     imagePicker.cameraCaptureMode = .photo 
     imagePicker.modalPresentationStyle = .fullScreen 
     present(imagePicker, 
       animated: true, 
      completion: nil) 

    } 

Dies startet die Gyro Capture während der Bilderfassung beginnt.

Ich habe es die Gyro-Daten zu einem optionalen Doppel, LivePhotoAxis: Double? Übergeben, während es dies innerhalb der "StartUpdates()" -Funktion misst.

Ich habe versucht, es zu "stoppen", um die Daten zu erfassen, sobald das Bild aufgenommen wurde, so dass die letzten bekannten Gyro-Daten in meiner Variablen gespeichert werden und in andere Funktionen übergehen können;

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
    stopUpdates() 
    let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage 
    saveImageToDocuments(image: chosenImage, fileNameWithExtension: "image.jpg") 
    dismiss(animated: true, completion: nil 

    ) 

} 

Allerdings ist das Problem, dass die stopUpdates() -Methode erst, nachdem der Benutzer „bestätigt“ sie mögen ihr geschnappt Foto (vs zurückzuerobern es) genannt wird.

Von dem, was ich gelesen habe, gibt es eine private API mit uiImagePickerControllerUserDidCaptureItem, die den genauen Moment fängt das Foto aufgenommen wird. Ich könnte NSNotification verwenden, um dies zu finden und StopUpdates() aufzurufen, sobald das Foto tatsächlich aufgenommen wurde.

Ist das richtig, dass dies eine private API ist? Kann ich das verwenden, um diesen Moment festzuhalten, oder wird meine App abgelehnt?

Ebenso gibt es einen besseren Weg, um mein Gyro-Updates auf dem genauen Zeitpunkt der Fotoaufnahme auszuschalten?

Danke!

Antwort

0

Ich habe diesen Code und es das Problem behoben, aber ich weiß noch nicht, ob dies eine private API und wird im App Store oder nicht erlaubt sein? Oder wenn es einen besseren Weg gibt, dies zu erreichen?

 NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "_UIImagePickerControllerUserDidCaptureItem"), object:nil, queue:nil, using: { note in 
      self.stopUpdates() 
     }) 

Update: Dies löst nicht den EXAKTEN Moment der Fotoaufnahme aus. Es wird ausgelöst, wenn das Foto "gesperrt" ist. Zwischen dem Drücken der Foto-Taste und dem Einrasten des Fotos befinden sich einige Sekunden (2 Sekunden). Wenn Sie das Telefon während dieser Zeit bewegen, sind die Gyro-Daten daher ungenau.

Irgendwelche Gedanken, wie man das verbessert?

Verwandte Themen