动画 calayers 不断跟随手指位置

Posted

技术标签:

【中文标题】动画 calayers 不断跟随手指位置【英文标题】:Animating calayers follow finger location constantly 【发布时间】:2012-07-27 04:39:52 【问题描述】:

我有一个 UIView 包含许多 UILabel。现在我长按其中一个标签,然后其他标签会飞到按下的标签上,其他标签会不断跟随我的手指位置。

我的问题是

    如何使用核心动画执行此任务? 在我的解决方案中,当标签数大于 20 时,动画非常缓慢。为什么?
-(void)viewDidLoad
        [super viewDidLoad];
        _longGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressGestureUpdated:)];
        _longGesture.numberOfTouchesRequired = 1;
        [[self dragView] addGestureRecognizer:_longGesture];

- (void)longPressGestureUpdated:(UILongPressGestureRecognizer *)longPressGesture

    switch (longPressGesture.state) 
    
        case UIGestureRecognizerStateBegan:
        
            location = [longPressGesture locationInView:self.view];
            [self startAllLayersAnimation];
            break;
        
        case UIGestureRecognizerStateChanged:  
        case UIGestureRecognizerStateEnded:
        
           location = [longPressGesture locationInView:self.view];
            [self startAllLayersAnimation];
            break;
        
        default:
            break;
    

- (void)startAllLayersAnimation

    [CATransaction begin];
    for (CALayer *layer in [self labelLayers]) 
    
        [self startAnimation:layer];
    
    [CATransaction commit];

- (void)startAnimation:(CALayer*)layer

    CGPoint now =((CALayer*)layer.presentationLayer).position;
    CABasicAnimation * cab = [CABasicAnimation animationWithKeyPath:@"position"];
    cab.delegate = self;
    cab.removedOnCompletion = NO;
    cab.fillMode = kCAFillModeForwards;
    cab.fromValue = [NSValue valueWithCGPoint:now];
    cab.toValue = [NSValue valueWithCGPoint:location];
    cab.duration = 1;
    //cab.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
    [layer addAnimation:cab forKey:@"revItUpAnimation"];

我的解决方案对吗?能告诉我如何更合适地执行此方法吗?

【问题讨论】:

您发布的代码已经使用了 Core Animation。您的动画持续时间为 1 秒,并且可以轻松计时。 1 秒是一个相当慢的动画。什么是迟缓,最初的动画或随后的手指跟随动画?你还没有展示你的那部分代码。 【参考方案1】:

尝试使用UITouch,而不是使用手势。这将有所帮助,因为 touchesBegantouchesMoved 的 2 个事件将包括您的 CABasicAnimation 方法。

【讨论】:

touchesMoved 会触发很多 startAnimations 被调用,我想什么都不会改变。你能详细解释一下吗

以上是关于动画 calayers 不断跟随手指位置的主要内容,如果未能解决你的问题,请参考以下文章

动画期间未调用 CALayer setPosition

动画期间无法获取 CALayer 的当前位置

未捕获的异常:CALayer 位置在做动画时包含 NaN

动画 CALayer

为啥我替换了一个 CALayer 的位置隐式动画,它仍然在我自己的位置之前开始?

UIVIew/CALayer 动画期间的回调