我创建了一个UIView
组件(在主故事板中占据了整个屏幕)。它链接到的类名为MyFullView
,如下所示:
import UIKit
class MyFullView: UIView {
var myTouch: UITouch?
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
// I only initialized myTouch here.
myTouch = UITouch()
myTouch = touches.first
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
// I just print out myTouch location, magically the value is updated for each finger movement, why?
print("myTouch = \(myTouch?.location(in: self))")
super.touchesMoved(touches, with: event)
}
}
我宣布了变量myTouch
&amp;在touchesBegan
回调中初始化它。我没有任何代码更新myTouch
的值。
但是当我在模拟器中运行我的应用程序时,鼠标点击&amp;移动/拖动,我可以看到日志.e.g。:
myTouch = Optional((100.5, 117.0))
myTouch = Optional((99.5, 117.0))
myTouch = Optional((99.0, 117.0))
myTouch = Optional((98.5, 117.0))
myTouch = Optional((98.5, 118.0))
myTouch = Optional((98.0, 118.0))
myTouch = Optional((97.5, 118.0))
...
为什么&amp;怎么地狱myTouch
变量更新自身的价值?我不明白,有人可以向我解释一下这个魔法是什么?
答案 0 :(得分:0)
你的答案在于第二行:
myTouch = UITouch()
myTouch = touches.first
您已将myTouch
分配给touches
中的第一个对象。当您获得触摸事件时,UITouch
将成为触摸生命周期的相同实例(直到您完成或取消)。
所以你在touchesMoved
看到了触摸的位置更新。
如果您想拥有原始位置,则需要将其存储起来。
请注意,您的代码会出现多点触控问题。
答案 1 :(得分:0)
UITouch是一个类,这意味着当您将变量设置为UITouch时,您将引用另一个UITouch,而不是创建一个新的UITouch。如果这对您来说是一个问题,我会将触摸存储为CGPoint(这是一个结构)。 Alex Wayne's answer很好地描述了类和结构之间的这种差异。