当我第一次回答时,我假设被拖动的视图有些复杂(例如,一个大CALayer
阴影,计算量可能很大)。因此,我的原始答案如下。但在随后的评论交流中,发现其中一个按钮有一个脉冲动画,这更有可能是问题所在。如果拖动性能不可接受,则应在拖动视图期间暂停动画。因此:
#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
像这段代码一样保存,这样如果你抓住被拖离中心一点的视图,它就不会在你身上跳动。