我似乎在使用以下设置时遇到了一些问题:
- 我有一个
UILongPressGestureRecognizer
(import UIKit.UIGestureRecognizerSubclass
) 的子类以覆盖touchesMoved
. - 我有一个按钮,其中包含这个 GestureRecognizer 子类的对象,它调用一个选择器。
- 此选择器调用的方法包含一个回调,每次调用时都会由原始 GestureRecognizer 子类
touchesMoved
调用。
因此,当我长按按钮,然后移动手指时,回调会被多次调用,我可以查看触摸的属性,例如数字。( touches.count
)
我正在尝试根据触摸信息转换 TabBarController 的视图控制器,但是当我实现它时,(通过selectedIndex =
或UIView.transitionFromView()
)回调仅在 longPressEvent 开始时调用。(即只有一次,而不是多次。)我不确定为什么会发生这种情况。由于该按钮位于 TabBarController 中,因此不应受到转换视图的影响。
以下是一些相关代码:
GestureRecognizer 子类:
import UIKit.UIGestureRecognizerSubclass
class LongPressGestureRecongnizerSubclass: UILongPressGestureRecognizer{
var detectTouchesMoved = false
var toCallWhenTouchesMoved: ((touches: Set<UITouch>) -> ())?
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent) {
if detectTouchesMoved{
toCallWhenTouchesMoved?(touches: touches)
}
}
}
识别出 longPress 时调用的委托方法。
func centerButtonLongPressed(tabBarView: TabBarView!){
for gestureRecognizer in tabBarView.centerButton.gestureRecognizers!{
if let longPressGestureRecognizer = gestureRecognizer as? LongPressGestureRecongnizerSubclass{
longPressGestureRecognizer.detectTouchesMoved = true
longPressGestureRecognizer.toCallWhenTouchesMoved = ({(touches: Set<UITouch>) -> (Void) in
//Here I can view touches properties every time touchesMoved() is called, but not when I try to transition view here.
})
}
}
}
更新:
我意识到问题在于,由于转换是同步调用的,它与touchesMoved()
. 当我将转换方法移出 UI 线程时,会引发以下错误:
此应用程序正在从后台线程修改自动布局引擎,这可能导致引擎损坏和奇怪的崩溃。这将在未来的版本中导致异常。
如何防止过渡的缓慢同步代码与touchesMoved()
?
我怎样才能实现我的设想?谢谢你的帮助。