0

次の設定で問題が発生しているようです。

  • をオーバーライドするために 、 UILongPressGestureRecognizer( )のサブクラスがあります。 import UIKit.UIGestureRecognizerSubclasstouchesMoved
  • セレクターを呼び出すこの 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()ですか?

自分が思い描いているものを実現するにはどうすればよいですか?助けてくれてありがとう。

4

1 に答える 1

0

アニメーションがタッチを中断しても問題ないことに気付きました。ここFoldingTabBarで見つけることができるカスタム UITabBarController を不適切に使用していたため、タッチがキャンセルされていました

于 2016-03-29T01:49:15.267 に答える