2017-11-04 26 views
7

Tôi đang tạo một ứng dụng có thể tạo video toàn cảnh ở chế độ ngang. Trong cảnh quan, nó hỗ trợ hai hướng: trái sang phải và từ dưới lên trên.CoreMotion - chuyển từ trái sang phải, chuyển động từ dưới lên trên iPhone ở chế độ ngang

Vì vậy, tôi muốn di chuyển mũi tên từ trái sang phải khi người dùng di chuyển điện thoại từ trái sang phải hoặc xoay sang phải. Cũng muốn di chuyển mũi tên từ trên lên trên khi di chuyển thiết bị theo chiều dọc lên trên. Trong ứng dụng máy ảnh iPhone nguyên bản có tùy chọn toàn cảnh, chúng tôi có thể thấy mô phỏng chính xác,

Câu hỏi của tôi là 1) làm cách nào để biết người dùng đang di chuyển điện thoại từ trái sang phải hoặc phải sang trái. Vì như ảnh toàn cảnh iPhone, tôi muốn dừng ghi khi người dùng quay lại.

Ngoài 2) làm thế nào để tôi biết người dùng đang di chuyển điện thoại theo chiều dọc lên


Added: 10 tháng 11 năm 2017: Tôi đã thấy một ứng dụng có tên Spincle trong AppStore. Nó đang di chuyển mũi tên khi xoay thiết bị từ trái sang phải để chụp ảnh 360 độ. Tôi chỉ quản lý để đạt được điều này bằng cách sử dụng pitch and roll (xem đoạn code dưới đây). Nhưng điều này sẽ không hoạt động nếu chúng ta đứng thiết bị xuống sàn nhà hoặc mái nhà một chút.

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() 
    } 
} 

Vấn đề là nó sẽ đi trái sang phải một chút và mũi tên di chuyển lên hoặc xuống

Trả lời

1

Bạn có thể sử dụng CLLocationManager để kiểm tra các tiêu đề của điện thoại của bạn, và viết thuật toán để xác định trái chuyển động từ phải/dưới cùng bằng cách tính toán độ của CLHeading.

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

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

+0

cho tôi kiểm tra. Nhưng ứng dụng Spincle hoạt động ngay cả khi dữ liệu vị trí bị tắt. – jpulikkottil

Các vấn đề liên quan