Reputation: 2649
I have a very strange problem with the UIPanGestureRecognizer. I use the recognizer to rotate a 3D model or the camera in a SceneView.
The recognizer works on iPhone. However, if I start the app on an iPad (either physical or the simulator), the recognizer is recognized, but the translation is always zero.
Why is that? Again, the iPhone works great. Is this a bug?
Recognizer creation:
// Model Rotation
let rotationRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.rotationRecognized(sender:)))
rotationRecognizer.minimumNumberOfTouches = 1
rotationRecognizer.maximumNumberOfTouches = 1
self.view.addGestureRecognizer(rotationRecognizer)
The 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
}
}
Upvotes: 1
Views: 523
Reputation: 2649
// 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
}
}
}
}
}
Upvotes: 1