1

UIView に多くの UILabels が含まれています。ラベルの 1 つを長押しすると、他のラベルがアニメーションで押されたラベルに移動し、他のラベルは常に指の位置に従います。

私の質問は

  1. コア アニメーションでこのタスクを実行するにはどうすればよいですか?
  2. 私のソリューションでは、ラベル番号が 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"];
}

私の解決策は正しいですか?この方法をより適切に実行する方法を教えてください。

4

1 に答える 1

0

ジェスチャーを使用する代わりに、を試して使用してくださいUITouch。の2つのイベントとして役立ちtouchesBegan、メソッドtouchesMovedが含まれますCABasicAnimation

于 2012-07-27T05:29:51.767 に答える