2016-12-05 4 views
0

흔들림 제스처 속도/가속도에 따라 속도가있는 상자의 왼쪽과 오른쪽에 공을 맞추려고합니다. 나는 이것을 얻을 수 없다. 나는 많은 것을 시도했지만 나는 제스처의 속도/가속을 얻을 수 없다. 나는 코어 모션뿐만 아니라 motionBegunmotionEnded 방법으로 제스처를 감지하지만 속도를 감지 할 수 없으므로 상자 양쪽에 공을 친 논리를 만들 수 있습니다. 다음은 내가 CoreMotion와 흔들림의 방향을 감지하고 motionBegunmotionEnded와 제스처 감지를 흔들 방법신속한 흔들기 제스처 3

var startedLeftTilt = false 
var startedRightTilt = false 
var dateLastShake = NSDate(timeIntervalSinceNow: -2) 
var dateStartedTilt = NSDate(timeIntervalSinceNow: -2) 
var motionManager = CoreMotion.CMMotionManager() 
let tresholdFirstMove = 3.0 
let tresholdBackMove = 0.5 



override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 

    motionManager.startGyroUpdates(to: OperationQueue.current!, withHandler: { (gyroData, error) -> Void in 
     self.handleGyroData(rotation: (gyroData?.rotationRate)!) 
    }) 

} 

private func handleGyroData(rotation: CMRotationRate) { 

    if fabs(rotation.z) > tresholdFirstMove && fabs(dateLastShake.timeIntervalSinceNow) > 0.3 
    { 
     if !startedRightTilt && !startedLeftTilt 
     { 
      dateStartedTilt = NSDate() 
      if (rotation.z > 0) 
      { 
       startedLeftTilt = true 
       startedRightTilt = false 
      } 
      else 
      { 
       startedRightTilt = true 
       startedLeftTilt = false 
      } 
     } 
    } 

    if fabs(dateStartedTilt.timeIntervalSinceNow) >= 0.3 
    { 
     startedRightTilt = false 
     startedLeftTilt = false 
    } 
    else 
    { 
     if (fabs(rotation.z) > tresholdBackMove) 
     { 
      if startedLeftTilt && rotation.z < 0 
      { 
       dateLastShake = NSDate() 
       startedRightTilt = false 
       startedLeftTilt = false 


      } 
      else if startedRightTilt && rotation.z > 0 
      { 
       dateLastShake = NSDate() 
       startedRightTilt = false 
       startedLeftTilt = false 


      } 
     } 
    } 

} 

override func becomeFirstResponder() -> Bool { 
    return true 
} 
override func motionBegan(_ motion: UIEventSubtype, with event: UIEvent?) { 
    if motion == .motionShake { 
     NSLog("Motion is Started"); 
    } 
} 
override func motionEnded(_ motion: UIEventSubtype, with event: UIEvent?) { 
    if motion == .motionShake { 
     NSLog("Motion is Ended"); 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    motionManager.gyroUpdateInterval = 0.01 
    // Do any additional setup after loading the view. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

답변

1

코어 운동은 많은 옵션을 가지고 내 코드입니다. 흔들기 이벤트와 같은 고급 이벤트를 사용하거나 자이로 또는 acellerometer 업데이트를 얻을 수 있습니다.

게시 한 코드가 자이로 이벤트를 모니터링합니다. 당신이 흔들림의 힘을 찾고 있다면 자이로 이벤트가 아니라 궤도 측정기가 필요합니다.

+0

자습서/예를 들어 주시겠습니까? –

+0

아니요, 자습서/예제가 없습니다. 나는 당신과 같은 것을 찾아야 할 것입니다. –

+0

시험 [링크] (https://github.com/cansurmeli/pedestrian-status) –

1

방아쇠를 당기기 위해 gyromotion을 동시에 사용하십시오. 자이로가 방향을 제공하고 모션이 일종의 속도 분석을 제공합니다. 사용자 지정 논리와 동시에 두 가지를 모두 구현하면 얻을 수있는 것입니다. 방향을 찾는 데 마지막 답을 사용하십시오. StackAnswer