2012-05-06 7 views
1

私はiOSアプリケーションのビューにUIPanGestureRecognizerを添付しました。パンハンドラのコードをTouches sample appからコピーしました。ジェスチャーが始まると、私のコード:アニメーションブロックでレイヤーanchorPointを設定すると、ビューがジャンプするのはなぜですか?

  • 元のアンカーポイントと中央を記録します。
  • はそうのように、ユーザの指の周りにあることをアンカーポイントとセンターを変更:

    CGPoint locationInView = [gestureRecognizer locationInView:target]; 
    CGPoint locationInSuperview = [gestureRecognizer locationInView:target.superview]; 
    target.layer.anchorPoint = CGPointMake(
        locationInView.x/target.bounds.size.width, 
        locationInView.y/target.bounds.size.height 
    ); 
    target.center = locationInSuperview; 
    

ジェスチャーが進むにつれて、受け皿ハンドラーは、継続的に指の動きを追跡するための中心を変更します。ここまでは順調ですね。

ユーザーが移動すると、元の開始点に戻るようにビューをアニメーション表示します。そのようなコードは、次のようになります。

そして、元の開始点にビューをアニメーション表示します。ただし、アニメーションが開始される前に、ビューはUIの別の場所にジャンプします。 IOW、手放す、ジャンプする、それはそれが所属する場所に戻る。

私はおそらく、ジェスチャーが始まるときのように、センターをスーパービューの位置に設定してアニメーションの外側にアンカーポイントとセンターを設定する必要があると思ったが、それは違いがないようだ。

私はここで何が欠けていますか?ユーザーが行かなくてもジャンプを防ぐことができますか?

+0

アンカーポイントが理解できていることを確認してください。http://stackoverflow.com/a/22188420/550393 – 2cupsOfTech

答えて

10

私はあなたが何をしているかを試すことなく、2つの問題が疑われる:

アンカーポイントを変更すると、ビューの/レイヤーの位置を変更します。位置の変更を加えることなくアンカーポイントを変更するためには、このいずれかのようないくつかのヘルパーを使用することができます(。私は自分自身私のプロジェクトであることを使用していますここで見つける:Changing my CALayer's anchorPoint moves the view

-(void)setAnchorPoint:(CGPoint)anchorPoint forView:(UIView *)view 
{ 
    CGPoint newPoint = CGPointMake(view.bounds.size.width * anchorPoint.x, view.bounds.size.height * anchorPoint.y); 
    CGPoint oldPoint = CGPointMake(view.bounds.size.width * view.layer.anchorPoint.x, view.bounds.size.height * view.layer.anchorPoint.y); 

    newPoint = CGPointApplyAffineTransform(newPoint, view.transform); 
    oldPoint = CGPointApplyAffineTransform(oldPoint, view.transform); 

    CGPoint position = view.layer.position; 

    position.x -= oldPoint.x; 
    position.x += newPoint.x; 

    position.y -= oldPoint.y; 
    position.y += newPoint.y; 

    view.layer.position = position; 
    view.layer.anchorPoint = anchorPoint; 
} 

アニメーションは、アンカーポイントを元の値に戻します。 上記のヘルパーを使用して、アンカーポイントをリセットする必要があります。これにより、アンカーの変更時にビューが移動しないようにします。アニメーションの外でこれを行う必要があります。その後、アニメーションブロックを使用してビューの中心を変更し、必要な場所にアニメートします。

+0

私は以前これを試していましたが、正しいとは言えませんでした。今夜もう一度試してみる。ありがとう! – theory

+0

それは画面のまったく別の部分にジャンプしますが、まだジャンプします:-(何とか設定した順序と関係があるかどうかを判断しようとします:ビューの中心、anchorPoint、および変換を行います。 – theory

+0

答えは「はい!」です。私は中心を設定してから、anchorPoint、次に変換を行いました。アンカーポイント(ヘルパーを使用)を設定し、変換し、最後に中心を設定するように変更しましたそれはちょうどうまく動作します。Phew!この機能についてのリマインダーをありがとう、私はもうちょっとそれを試してみる必要がありました。 – theory

関連する問題