【问题标题】:Translation of UIPanGestureRecognizer is always zero in iPadUIPanGestureRecognizer 的翻译在 iPad 中始终为零
【发布时间】:2017-05-15 19:53:46
【问题描述】:

UIPanGestureRecognizer 有一个非常奇怪的问题。我使用识别器在 SceneView 中旋转 3D 模型或相机。

识别器适用于 iPhone。但是,如果我在 iPad(物理设备或模拟器)上启动应用程序,识别器会被识别,但翻译始终为零。

这是为什么呢?再次,iPhone 运行良好。这是一个错误吗?

识别器创建:

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

事件处理程序:

// 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
    }
}

【问题讨论】:

    标签: swift rotation scenekit uipangesturerecognizer


    【解决方案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
                    }
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-26
      • 2016-05-02
      • 2012-01-16
      • 2020-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多