問題は、連続ジェスチャの最初からの翻訳であるため、翻訳が累積されるtranslationInView
ことですが、元のフレームではなく、現在のフレームに翻訳を追加していることになります。これは、ジェスチャの状態を確認することで解決されます。ジェスチャの開始時に元のフレームを保存し、ジェスチャが進むにつれて、それを将来の翻訳の基礎として使用します。
-(void) panningMyView:(UIPanGestureRecognizer*) panGesture
{
static CGRect originalFrame; // or you could make this a non-static class ivar
if (panGesture.state == UIGestureRecognizerStateBegan)
{
originalFrame = self.myPanningView.frame;
}
else if (panGesture.state == UIGestureRecognizerStateChanged)
{
CGPoint translation = [panGesture translationInView:self.view];
if (translation.x > 0) {
CGRect newFrame = originalFrame;
newFrame.size.width += translation.x;
newFrame.size.height += translation.y;
self.myPanningView.frame = newFrame;
}
}
}
oldPoint
注意してください、あなたがそれを使用していないようだったので、私はそれを取り除きました。また、画面上のポイントではなく、画面上で指がどれだけ移動(または移動)したかを示すために、名前を変更newPoint
しました。また、それが何であるかをより正確に捉えていると思うので、名前をにtranslation
変更oldRect
しました。newFrame
基本的に、私はあなたのルーチンのロジックを維持しようとしましたが、単にあなたのロジックと変数名を明確にします。終了またはキャンセルされたジェスチャをチェックし、アニメーションを使用してジェスチャを完了または反転するなど、追加の原因が必要になる可能性があると思いelse if
ましたが、元の質問でこれを参照していなかったため、これには取り組みませんでした。
とにかく、私たちがここで何をしているのかを理解していただければ幸いです。現在のフレームに適用するのではなく、元のフレームを保存して、それに変換を適用します。
アップデート:
フォローアップの質問で、アニメーションを明確にする方法を尋ねました。あなたは次のようなことをするかもしれません:
-(void) panningMyView:(UIPanGestureRecognizer*) panGesture
{
static CGRect originalFrame; // or you could make this a non-static class ivar
CGPoint translation = [panGesture translationInView:self.view];
if (panGesture.state == UIGestureRecognizerStateBegan)
{
originalFrame = self.myPanningView.frame;
}
else if (panGesture.state == UIGestureRecognizerStateChanged)
{
if (translation.x > 0) {
CGRect newFrame = originalFrame;
newFrame.size.width += translation.x;
newFrame.size.height += translation.y;
self.myPanningView.frame = newFrame;
}
}
else if (panGesture.state == UIGestureRecognizerStateEnded ||
panGesture.state == UIGestureRecognizerStateCancelled ||
panGesture.state == UIGestureRecognizerStateFailed)
{
CGRect finalFrame = originalFrame;
// if we've gone more than half way, move it all the way,
// otherwise return it to the original frame
if (translation.x > (self.view.frame.size.width / 2.0))
{
finalFrame.size.width += self.view.frame.size.width;
finalFrame.size.height += self.view.frame.size.height;
}
[UIView animateWithDuration:0.5
delay:0.0
options:UIViewAnimationOptionCurveEaseOut
animations:^{
self.myPanningView.frame = finalFrame;
}
completion:nil];
}
}