2017-11-04 18 views
7

Tworzę aplikację, która umożliwia tworzenie panoramicznego wideo w krajobrazie. W krajobrazie obsługuje dwa kierunki: od lewej do prawej i od dołu do góry.CoreMotion - ruch od lewej do prawej, od dołu do góry na iPhonie w krajobrazie

Dlatego chcę przesunąć strzałkę od lewej do prawej, gdy użytkownik przesunie telefon od lewej do prawej lub obróci w prawo. Również chcesz przesunąć strzałkę od dołu do góry, gdy przesuniesz urządzenie pionowo w górę. W natywnej aplikacji aparatu iPhone z opcją panoramy możemy zobaczyć poprawną symulację,

Moje pytania to 1) skąd mam wiedzieć, że użytkownik przesuwa telefon z lewej na prawą lub z prawej na lewą. Ponieważ podobnie jak w przypadku panoramy iPhone'a, chcę zatrzymać nagrywanie, gdy użytkownik się cofnie.

także 2) Jak mogę wiedzieć użytkownik porusza telefon pionowo w górę


Dodano: 10 listopada 2017: widziałem aplikację o nazwie Spincle w AppStore. Przesuwa strzałkę podczas obracania urządzenia od lewej do prawej, aby wykonać zdjęcie 360 ​​stopni. Udało mi się to osiągnąć za pomocą pitch and roll (zobacz poniższy kod). Ale to nie zadziała, jeśli stoimy trochę nad podłogą lub dachem.

import UIKit 
import CoreMotion 
class ViewController: UIViewController { 
    private let motionManager = CMMotionManager() 
    let arrowView = UIView() 
    func startMotion() { 
     var initialAttitude: CMAttitude? 
     motionManager.deviceMotionUpdateInterval = 1 
     let queue = OperationQueue.current! 
     let statusBarOrientation = UIApplication.shared.statusBarOrientation 
     motionManager.startDeviceMotionUpdates(using: CMAttitudeReferenceFrame.xArbitraryZVertical, to: queue) { (motiondata, err) in 
      guard let data = motiondata else { return } 
      if initialAttitude == nil { 
       initialAttitude = data.attitude 
      } else { 
       let attitude = data.attitude 
       // translate the attitude 
       attitude.multiply(byInverseOf: initialAttitude!) 
       // calculate pitch and roll of the change from our initial attitude 
       let pitch = self.radiansToDegrees(attitude.pitch) 
       let roll = self.radiansToDegrees(attitude.roll) 
       print("\nroll = \(roll), pitch = \(pitch), yaw = \(self.radiansToDegrees(attitude.yaw))") 
       print("x = \(data.userAcceleration.x), y = \(data.userAcceleration.y), z = \(data.userAcceleration.z)") 
       DispatchQueue.main.async { 
        var rect = self.arrowView.frame 
        var addXPixel = self.view.frame.size.width/45 
        var addYPixel = self.view.frame.size.height/45 
        if statusBarOrientation == .landscapeRight { 
         addXPixel *= -1 
        } else { 
         addYPixel *= -1 
        } 
        rect.origin.x = (CGFloat(pitch) * addXPixel) 
        rect.origin.y = (self.view.frame.size.height/2 - 20) + (CGFloat(roll) * addYPixel) 
        self.arrowView.frame = rect 
       } 
      } 
     } 
    } 
    func stopMotion() { 
     motionManager.stopDeviceMotionUpdates() 
    } 
    func radiansToDegrees(_ radian: Double) -> Float { 
     return Float(radian * 180.0/Double.pi) 
    } 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     view.addSubview(arrowView) 
     arrowView.backgroundColor = UIColor.red 
    } 
    @IBAction func tappedButton() { 
     arrowView.frame = CGRect(x: 0, y: self.view.frame.size.height/2 - 20, width: 40, height: 40) 
     startMotion() 
    } 
} 

Kwestia ta będzie skręcić w lewo w prawo i nieco strzałki ruchu w górę iw dół

Odpowiedz

1

Można użyć CLLocationManager sprawdzić nagłówek telefonu i napisać algorytm do ustalenia z lewej ruch prawy/dolny górny, obliczając stopnie CLHeading.

- (void)locationManager:(CLLocationManager*)manager 
     didUpdateHeading:(CLHeading*)newHeading 

https://developer.apple.com/documentation/corelocation/clheading

+0

pozwól mi sprawdzić. Ale aplikacja Spincle działa nawet wtedy, gdy dane lokalizacji są wyłączone. – jpulikkottil

Powiązane problemy