当我拖动视图并将其放到新位置时。每次都会调用 Ended。
当我拖动视图一段时间并将其放在开始的同一位置时,没有任何内容被调用,我期望 .Ended 或 default 被调用,但没有发生。
为什么会出现这种情况?我如何了解用户何时持续释放视图?
var gestureRecognizer = UIPanGestureRecognizer(target: self, action: Selector("dragged:"))
gestureRecognizer.delegate = self
view.addGestureRecognizer(gestureRecognizer)
func dragged(gesture: UIPanGestureRecognizer) {
switch gesture.state {
case UIGestureRecognizerState.Began:
print("calls this everytime touch began")
case UIGestureRecognizerState.Ended:
print("doesn't call this everytime")
default:
print("never calls this")
}
}
您几乎应该始终使用 UIGestureRecognizerState.Ended || UIGestureRecognizerState.Cancelled 作为两者之一肯定会在手势结束时被调用。这样您还可以处理用户拖过屏幕的情况。
当我的 switch 语句中有
.recognized
的情况时,这发生在我身上(不要这样做)。
就我而言,仅当我使用键盘上的 option 键在模拟器中使用两指捏合或旋转手势时,才会发生这种情况。
通常在手势结束后再次按 option 键(不移动鼠标)似乎可以解决问题并达到
.ended
状态。
我在实际设备上没有遇到这个问题。
当您在
.recognized
案例之前有 .ended
作为案例时,可能会发生这种情况。如果您让 Xcode 自动完成所有案例,您可能会将 .recognized
作为案例。
问题是
.recognized
不是枚举的情况,它是一个静态变量(这是 Apple 手势识别器实现中的行):
public static var recognized: UIGestureRecognizer.State { get }
如果我尝试打印手势识别器的
.state
和 .recognized
静态变量的原始值,我会得到这个。
@objc func handlePan(_ gestureRecognizer: UIPanGestureRecognizer) {
print(gestureRecognizer.state.rawValue, UIPanGestureRecognizer.State.recognized.rawValue)
}
将打印此:
1 3
2 3
3 3
右侧的“3”是手势识别器上静态
.recognized
的值,它始终是 .ended
。左边的“3”是手势识别器上实际.state
的rawValue。