【问题标题】:Create a class that inherits from UITouch创建一个继承自 UITouch 的类
【发布时间】:2016-11-17 21:50:23
【问题描述】:

我正在使用 Swift 3 和 Xcode

我有以下课程:

class Finger: UITouch
{
    var firstTimeStamp: TimeInterval = 0.0
}

还有这个变量:

var finger: Finger?

这是我的touchesBegan 函数:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
{
    if finger == nil
    {
        let touch = touches.first
        finger = touch as! GameScene.Finger?    <--- ERROR
        finger?.firstTimeStamp = finger!.timestamp
    }
}

它可以构建,但是当我触摸屏幕时出现此错误: Could not cast value of type 'UITouch' (0x10f3b1ca8) to 'Project.GameScene.Finger' (0x10c3f71a0).

我想知道手指在屏幕上的时间,从 touchesBegan 到 touchesEnded。这是最好的方法吗? 无论如何,我做错了什么?

【问题讨论】:

    标签: swift timestamp uitouch touchesbegan nstimeinterval


    【解决方案1】:

    我在 UIViewController 中插入下面的代码。

    方式 1

    var touchBeginDate:Date?
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("touchesBegan")
        if touchBeginDate == nil {
            touchBeginDate = Date()
        }
    }
    
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    
        if let touchBeginDate = touchBeginDate {
    
            let calendar = Calendar.current
            let components = calendar.dateComponents([Calendar.Component.second, Calendar.Component.minute], from: touchBeginDate, to: Date())
            print("\(components)")
        }
    
        touchBeginDate = nil
        print("touchesEnded")
    }
    

    结果

    方式 2

    class TapGestureRecognizer: UILongPressGestureRecognizer {
        var touchBeginDate:Date?
    }
    
    class ViewController: UIViewController, UIGestureRecognizerDelegate {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            let tapGestureRecognizer = TapGestureRecognizer(target: self, action: #selector(ViewController.action(tapGestureRecognizer:)))
            tapGestureRecognizer.delegate = self
            tapGestureRecognizer.delaysTouchesBegan = false
            tapGestureRecognizer.delaysTouchesEnded = false
            view.addGestureRecognizer(tapGestureRecognizer)
        }
    
        func action(tapGestureRecognizer: TapGestureRecognizer) {
            switch tapGestureRecognizer.state {
            case .began:
                print("touch began")
                if tapGestureRecognizer.touchBeginDate == nil {
                    tapGestureRecognizer.touchBeginDate = Date()
                }
            case .ended:
                if let touchBeginDate = tapGestureRecognizer.touchBeginDate {
                    let calendar = Calendar.current
                    let components = calendar.dateComponents([Calendar.Component.second, Calendar.Component.minute], from: touchBeginDate, to: Date())
                    print("\(components)")
                }
                tapGestureRecognizer.touchBeginDate = nil
                print("touch ended")
            case .cancelled:
                break
            case .failed:
                break
            case .possible:
                break
            case .changed:
                break
            }
        }
    }
    

    【讨论】:

    • 感谢您的回答。事实是,我想在我的class Finger: UITouch 中存储比 timeStamp 更多的属性,所以这个替代方法有效,但它不能解决创建从 UITouch 继承的类而没有错误的主要问题。
    猜你喜欢
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多