私が最初に答えたとき、私は、ドラッグされているビューについて何か複雑なことがあると思っていました(たとえば、大きなCALayer
影は計算コストがかかる可能性があります)。したがって、以下の私の元の答え。しかし、その後のコメント交換で、ボタンの1つに脈打つアニメーションがあることが発見されました。これは、問題である可能性が高いです。ドラッグのパフォーマンスが許容できない場合は、ビューのドラッグ中にアニメーションを一時停止する必要があります。したがって:
#import <QuartzCore/QuartzCore.h>
- (IBAction)pan:(UIPanGestureRecognizer *)gesture
{
static CGPoint originalCenter;
if (gesture.state == UIGestureRecognizerStateBegan)
{
originalCenter = gesture.view.center;
[self pauseLayer:gesture.view.layer];
}
else if (gesture.state == UIGestureRecognizerStateChanged)
{
CGPoint translate = [gesture translationInView:gesture.view.superview];
gesture.view.center = CGPointMake(originalCenter.x + translate.x, originalCenter.y + translate.y);
}
else if (gesture.state == UIGestureRecognizerStateEnded ||
gesture.state == UIGestureRecognizerStateFailed ||
gesture.state == UIGestureRecognizerStateCancelled)
{
[self resumeLayer:gesture.view.layer];
}
}
-(void)pauseLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
layer.speed = 0.0;
layer.timeOffset = pausedTime;
}
-(void)resumeLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer timeOffset];
layer.speed = 1.0;
layer.timeOffset = 0.0;
layer.beginTime = 0.0;
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
layer.beginTime = timeSincePause;
}
明らかに、これは以下で説明する画像のラスタライズと組み合わせることができますが、最初に上記のようにアニメーションを一時停止してみます。
元の答え:
ドラッグされているビューがまったく複雑な場合は、ラスタライズしてみてください。
QuartzCore.framework
ターゲットの「ライブラリとバイナリをリンクする」設定に追加します。
次に、ソースを調整して、それに応じてラスタライズします。
そのような:
#import <QuartzCore/QuartzCore.h>
- (IBAction)pan:(UIPanGestureRecognizer *)gesture
{
static CGPoint originalCenter;
if (gesture.state == UIGestureRecognizerStateBegan)
{
originalCenter = gesture.view.center;
gesture.view.layer.shouldRasterize = YES;
}
if (gesture.state == UIGestureRecognizerStateChanged)
{
CGPoint translate = [gesture translationInView:gesture.view.superview];
gesture.view.center = CGPointMake(originalCenter.x + translate.x, originalCenter.y + translate.y);
}
if (gesture.state == UIGestureRecognizerStateEnded ||
gesture.state == UIGestureRecognizerStateFailed ||
gesture.state == UIGestureRecognizerStateCancelled)
{
gesture.view.layer.shouldRasterize = NO;
}
}
余談originalCenter
ですが、このコードのように保存することをお勧めします。そうすれば、ビューを中心から少しずらしてドラッグしても、ぎこちなくジャンプすることはありません。