2017-01-01 4 views
1

Ich habe ein sehr seltsames Problem mit dem UIPanGestureRecognizer. Ich benutze den Erkenner, um ein 3D-Modell oder die Kamera in einem SceneView zu drehen.Übersetzung von UIPanGestureRecognizer ist immer Null in iPad

Der Erkenner funktioniert auf dem iPhone. Wenn ich die App jedoch auf einem iPad (physisch oder im Simulator) starte, wird der Erkenner erkannt, aber die Übersetzung ist immer Null.

Warum ist das? Auch hier funktioniert das iPhone großartig. Ist das ein Fehler?

Recognizer Schöpfung:

// Model Rotation 
let rotationRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.rotationRecognized(sender:))) 
rotationRecognizer.minimumNumberOfTouches = 1 
rotationRecognizer.maximumNumberOfTouches = 1 
self.view.addGestureRecognizer(rotationRecognizer) 

Der Event-Handler:

// MARK: Rotation of Model and Camera 
func rotationRecognized(sender: UIPanGestureRecognizer) { 
    if sender.state == .began { 
     let translation = sender.translation(in: self.sceneView) 
     Swift.print(translation) 

     if abs(translation.x) > 0 { 
      self.rotationMode = .model 
     } else if abs(translation.y) > 0 { 
      self.rotationMode = .camera 
     } 
    } else if sender.state == .changed { 
     let translation = sender.translation(in: self.sceneView) 

     if self.rotationMode == .model { 
      if rootNode != nil { 
       var newAngleY = Float(translation.x/4) * Float(M_PI/180.0) 
       newAngleY += currentYAngle 
       rootNode!.eulerAngles.y = newAngleY 
      } 
     } else if self.rotationMode == .camera { 
      if cameraNode != nil { 
       var newAngle = Float(translation.y/4) * Float(M_PI/180.0) 

       if translation.y < 0 { // Up 
        if Math.toDegrees(Double(newAngle + currentXAngle)) < -70 { 
         return 
        } 
       } else if translation.y > 0 { // Down 
        if Math.toDegrees(Double(newAngle + currentXAngle)) > -10 { 
         return 
        } 
       } 

       newAngle += currentXAngle 
       cameraNode!.eulerAngles.x = newAngle 
      } 
     } 
    } else if sender.state == .ended { 
     if self.rotationMode == .model { 
      if rootNode != nil { 
       currentYAngle = rootNode!.eulerAngles.y 
      } 
     } else if self.rotationMode == .camera { 
      if cameraNode != nil { 
       currentXAngle = cameraNode!.eulerAngles.x 
      } 
     } 

     self.rotationMode = .none 
    } 
} 

Antwort

1
// MARK: Rotation of Model and Camera 
func rotationRecognized(sender: UIPanGestureRecognizer) 
{ 
    if sender.state == .ended 
    { 
     if self.rotationMode == .model 
     { 
      if rootNode != nil 
      { 
       currentYAngle = rootNode!.eulerAngles.y 
      } 
     } 
     else if self.rotationMode == .camera 
     { 
      if cameraNode != nil 
      { 
       currentXAngle = cameraNode!.eulerAngles.x 
      } 
     } 

     self.rotationMode = .none 
     return 
    } 

    let translation = sender.translation(in: sender.view) 

    // Began 
    if translation.x == 0 && translation.y == 0 && self.rotationMode == .none 
    { 
     return 
    } 
    else 
    { 
     // First change after recognition 
     if self.rotationMode == .none 
     { 
      if abs(translation.x) > 0 
      { 
       self.rotationMode = .model 
      } 
      else if abs(translation.y) > 0 
      { 
       self.rotationMode = .camera 
      } 
     } 
     else 
     { 
      if self.rotationMode == .model 
      { 
       if rootNode != nil 
       { 
        var newAngleY = Float(translation.x/4) * Float(M_PI/180.0) 
        newAngleY += currentYAngle 
        rootNode!.eulerAngles.y = newAngleY 
       } 
      } 
      else if self.rotationMode == .camera 
      { 
       if cameraNode != nil 
       { 
        var newAngle = Float(translation.y/4) * Float(M_PI/180.0) 

        if translation.y < 0 // Up 
        { 
         if Math.toDegrees(Double(newAngle + currentXAngle)) < -70 
         { 
          return 
         } 
        } 
        else if translation.y > 0 // Down 
        { 
         if Math.toDegrees(Double(newAngle + currentXAngle)) > -10 
         { 
          return 
         } 
        } 

        newAngle += currentXAngle 
        cameraNode!.eulerAngles.x = newAngle 
       } 
      } 
     } 
    } 
}