17

UIViewを使用してオブジェクトを移動していますUIPanGestureRecognizer—画面上で指をどれだけドラッグするか、同じ方向にビューを移動します(Xのみ-左または右、Yは変更されません)。正常に動作しますが、(非常に目立つ)遅延があります。

UIPanGestureRecognizerイベントを処理するメソッドは次のとおりです。

-(void)movePages:(UIPanGestureRecognizer *)sender
{
    if (switchingMode == 1) {
        if ([sender state] == UIGestureRecognizerStateBegan) {
            fingerStartPosition = [sender locationInView:self.view].x;
            viewStartPosition = [[viewControllers objectAtIndex:activeViewControllerIndex] view].center;
        }
        [[[[viewControllers objectAtIndex:activeViewControllerIndex] view] layer] setPosition:CGPointMake(viewStartPosition.x - (fingerStartPosition - [sender locationInView:self.view].x) , viewStartPosition.y)];            
    }
}

レイヤーを使用してビューの位置を設定しようとしました。また、さまざまな長さのアニメーションを使用してフレームを設定しようとしましたが、すべて同じように動作しました。この遅延が発生する理由はありますか?

4

3 に答える 3

44

を使用して、UILongPressGestureRecognizerをに設定minimumPressDuration0.0ます。これは即座に認識され、更新された場所を含むすべての同じ更新を取得しますUIGestureRecognizerStateChanged

于 2012-12-01T19:38:47.337 に答える
4

通常のtouchsBegan、Moved、Endedだけを使用すると、応答が速くなることがわかりました。UIGestureRecognizerをサブクラス化したのですが、それでもパンジェスチャに遅れがありました。UIGestureRecognizer内のtouchesBeganは時間どおりにトリガーされますが、状態の変更には0.5秒かかります...特にCPUが多くのことを行っている場合は、単純な古いTouchesBeganを使用する方が速いようです。

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)
{
    if touches.count == 1
    {
        initialTouchLocation = (touches.first?.locationInView(self).x)!
    }
}
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?)
{
    if touches.count == 1
    {
        let locationInView = touches.first?.locationInView(self)
        if !thresholdHit
        {
            //this is the threshold for x movement in order to trigger the panning...
            if abs(initialTouchLocation - locationInView!.x) > 1
            {
                thresholdHit = true
            }
        }
        else
        {
            if (self.frame.width != CGFloat(screenSize))
            {
                let panDelta = initialTouchLocation - locationInView!.x
            }
        }
    }
}
于 2016-02-19T06:34:56.867 に答える
3

GestureRecognizerは、それがパンジェスチャである場合、指を数ピクセル動かす前に確認できません。正確な許容値はわかりませんが、それが遅れを感じる理由です。

ドキュメンテーション:

パンジェスチャは継続的です。それは、許可された最小数の指が鍋と見なされるのに十分に動いたときに始まります。

瞬時に移動したい場合は、を使用して独自のロジックを構築する必要がありますtouchesMoved:

別のアプローチは、最初に認識されたポイントにアニメーション化することです。しかし、それは遅延を取り除くものではありません。そのアプローチについては、githubで私のJDDroppableViewを見ることができます。

于 2012-05-23T21:29:39.817 に答える