inexcitus
inexcitus

Reputation: 2649

Translation of UIPanGestureRecognizer is always zero in iPad

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

Answers (1)

inexcitus
inexcitus

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

Related Questions