0

CALayer画面上の別の場所にドラッグしたを使用した後、元の位置に戻る アニメーションを作成したいと思いUIPanGestureRecognizerます。

これが私が持っているものです:

@interface ViewController () {
    CGPoint defaultButtonPosition;
    CGPoint lastPosition;
}
@end


@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    defaultButtonPosition = _roundShape.layer.position;

    self.view.backgroundColor = [UIColor blackColor];

    [_roundShape displayShape];

    [self.view.layer addSublayer:_roundShape.layer];

}

//code so I can drag my CALayer
- (IBAction)dragShape:(UIPanGestureRecognizer *)sender
{
    CGPoint translation = [sender translationInView:self.view];
    sender.view.center = CGPointMake(sender.view.center.x + translation.x, sender.view.center.y + translation.y);
    [sender setTranslation:CGPointMake(0, 0) inView:self.view];

    lastPosition = sender.view.center;

    if (sender.state == UIGestureRecognizerStateEnded) {
        NSLog(@"Pan ended");
        [self animateBackToOriginalPosition];

       _roundShape.center = lastPosition;
    }
}


- (void)animateBackToOriginalPosition
{        
    CABasicAnimation *moveBackToOriginalPosition = [CABasicAnimation animationWithKeyPath:@"position"];
    moveBackToOriginalPosition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];

    moveBackToOriginalPosition.fromValue = [NSValue valueWithCGPoint:lastPosition];
    moveBackToOriginalPosition.toValue = [NSValue valueWithCGPoint:defaultPosition];
    moveBackToOriginalPosition.repeatCount = 0;
    moveBackToOriginalPosition.duration = 1.0;
    [_roundShape.layer addAnimation:moveBackToOriginalPosition forKey:@"position"];

}

このコードから発生するアニメーションは、私が望むものにはほど遠いです。ドラッグしているCALayerを離すと、突然消えて、一見ランダムな場所から、設定したtoValue(= defaultPosition)ではなくlastPositionにアニメーション化されます。その後、CALayerは表示されなくなります。

CALayerをドラッグしても、NSLogは常にdefaultPositionにあると通知するため、positionプロパティは変更されないようです。そのため、使用してみ_roundShape.center = lastPosition;ましたが、CALayerが消えてしまいます。これがないと、CALayerは画面に表示されたままになります。

私は自分の問題を十分に説明したと思います。私が自分のコードで犯した初心者の間違いを聞きたいです。

4

2 に答える 2

0

nslog または printf を使用して、CGPoint の defaultButtonPosition の座標を調べます (そして CAAnimation コードに正しく入力します)。ほとんどの場合、「消えるビュー」は、表示されているウィンドウから遠く離れた座標から発生します。ここでは、レイヤーをビューに追加する前にデフォルトのポイントが設定されましたが、最後の位置は後で設定されます。これを変更してみるか、電話してください

 convertPoint: toView:
于 2012-10-03T22:00:07.923 に答える
0

変換行列を使用してみてください。これははるかに簡単で、一時的な変換に適しています。レイヤーを元の位置に変換する場合は、トランスマトリックスを単位マトリックスに等しくするだけです(この方法では、前の位置を保持する必要もありません)

于 2012-10-03T22:11:11.463 に答える