在拖动时动画UIView

时间:2012-05-31 10:33:32

标签: iphone ios animation uiview uipangesturerecognizer

我正在尝试在用户开始拖动时为UIView扩展设置动画,并在停止拖动时对其进行动画处理。在iOS5中,这似乎有效,虽然不是很完美 - 视图动画在扩展时移动到当前手指位置(如此滞后),但在扩展动画结束时工作正常。

在iOS4中,它只是被打破了 - 视图动画扩展,但在动画结束之前根本不会用用户的手指移动。

我该怎么办?

- (void)gestureRecognizerMoved:(id)sender
{
    [self.view bringSubviewToFront:[(UIPanGestureRecognizer*)sender view]];
    CGPoint translatedPoint = [(UIPanGestureRecognizer*)sender translationInView:self.view];
    NSLog(@"translated x %f y %f", translatedPoint.x, translatedPoint.y);

    if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan)
        {
        firstX = [sender view].center.x;
        firstY = [sender view].center.y;

        NSLog(@"first x %f y %f", firstX, firstY);
    }

    translatedPoint = CGPointMake([sender view].center.x, firstY+translatedPoint.y);
    [[sender view] setCenter:translatedPoint];

    if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan)
    {
        [UIView animateWithDuration:0.8f animations:^(void)
         {
             CGRect frame = [sender view].frame;
             frame.size.width += 200.0f;
             [sender view].frame = frame;
         }];
    }

    if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded)
    {
        [UIView animateWithDuration:0.8f animations:^(void)
         {
             CGRect frame = [sender view].frame;
             frame.size.width -= 200.0f;
             [sender view].frame = frame;
         }];
    }
}
编辑:使用核心图形仿射变换来调整视图大小(例如CGAffineTransformMakeScale)而不是修改视图的框架摆脱了iOS5中的延迟,所以现在即使在动画期间它也坚持用户的手指按压,而不是动画到新闻地点,完美!但是在iOS4中仍然遇到同样的问题。

2 个答案:

答案 0 :(得分:1)

您可能应该在动画选项中添加UIViewAnimationOptionBeginFromCurrentState

编辑:

您应该使用UIViewAnimationOptionBeginFromCurrentState,因为您的手势可以在动画结束前结束。

查看视图center只是更改视图frame的另一种方法。这两个属性会更改相同的数据。如果您要设置frame大小的动画,然后直接通过center更改框架(覆盖动画的内容),则无法获得所需内容。

我看到的简单解决方案是将您的视图放入透明容器中并更改容器的位置,同时视图仍然可以为其大小设置动画。

答案 1 :(得分:0)

尝试使用UIViewAnimationOptionAllowUserInteraction选项,它应该可以工作:)