次の設定で問題が発生しているようです。
- をオーバーライドするために
、
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()
ですか?
自分が思い描いているものを実現するにはどうすればよいですか?助けてくれてありがとう。