【问题标题】:CABasicAnimation after UIPanGestureRecognizerUIPanGestureRecognizer 之后的 CABasicAnimation
【发布时间】:2012-09-24 19:15:31
【问题描述】:

在使用UIPanGestureRecognizerCALayer 拖动到屏幕上的其他位置后,我想将CALayer 动画化回其初始位置。

这是我得到的:

@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 时,它突然消失并从看似随机的位置动画到 lastPosition 而不是我设置的 toValue (=defaultPosition)。之后,CALayer 不再可见。

似乎当我拖动 CALayer 时,位置属性并没有改变,因为 NSLog 总是告诉我它仍然处于默认位置。这就是我尝试使用_roundShape.center = lastPosition; 的原因,但这只会导致CALayer 消失。如果没有这个,CALayer 会在屏幕上保持可见。

我希望我能很好地解释我的问题。我很想听听我在代码中犯了哪些新手错误。

【问题讨论】:

    标签: objective-c ios6 cabasicanimation uipangesturerecognizer


    【解决方案1】:

    尝试使用 nslog 或 printf 了解 CGPoint defaultButtonPosition 的坐标(并将其正确输入到 CAAnimation 代码中)。 “消失视图”大部分时间来自远离可见窗口的坐标:这里,默认点是在将图层添加到视图之前设置的,但最后一个位置是在之后设置的。尝试更改此设置,或致电

     convertPoint: toView:
    

    【讨论】:

    • 所以我尝试在将图层添加到视图后设置 defaultPosition 但它没有任何区别。我用 IB 创建了图层的视图,所以也许这就是没有任何区别的原因。 NSLog 显示了正确的位置。问题似乎是我无法获得lastPosition。当我将图层拖离其 defaultPosition 时,NSLog 告诉我 lastPosition 与 defaultPosition 相同。所以看起来我拖动的不是图层,而是图层的副本(?)。
    • 你不是 NSLogging 包含图层的视图的中心吗?此外,应该使用 layer.position 对图层进行动画处理(一旦获得正确的坐标,就可以使用 CATransform3DMakeTranslation),并注意在 pangesturerecognizer 方法中正确设置锚点。移动图层会引发很多坐标问题,您需要充分了解图层中的选定点将如何在视图和主窗口中被考虑。
    • 好的,我现在得到了正确的 lastPosition。我犯的另一个错误是我将 UIPanGestureRecognizer 连接到了错误的视图!当我看到 UILabel 也在移动时,我注意到它不应该这样做。现在图层确实移动到了正确的位置,但在移动到那里后消失并回到我拖动它的位置。现在应该很容易修复。
    • 很好!请随时更新您的代码,以便我们在需要时提供更多帮助。
    【解决方案2】:

    尝试使用转换矩阵,它更容易并且适合临时转换。当你想要一个层转换到它的原始位置时,你只需将 trans 矩阵等于单位矩阵(这样你也不需要保持你的 prev 位置)

    【讨论】:

    • 我可以试试这个,但我认为只为图层位置的变化设置动画会很容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多