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ół
pozwól mi sprawdzić. Ale aplikacja Spincle działa nawet wtedy, gdy dane lokalizacji są wyłączone. – jpulikkottil