UIView に多くの UILabels が含まれています。ラベルの 1 つを長押しすると、他のラベルがアニメーションで押されたラベルに移動し、他のラベルは常に指の位置に従います。
私の質問は
- コア アニメーションでこのタスクを実行するにはどうすればよいですか?
- 私のソリューションでは、ラベル番号が 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"];
}
私の解決策は正しいですか?この方法をより適切に実行する方法を教えてください。