0

我正在尝试在用户开始拖动 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;
         }];
    }
}

编辑:使用 Core Graphics 仿射变换来调整视图大小(例如 CGAffineTransformMakeScale)而不是修改视图的框架摆脱了 iOS5 中的滞后,所以现在即使在动画期间它也会坚持用户的手指按压,而不是动画到按压位置, 完美的!但是在iOS4中仍然遇到同样的问题。

4

2 回答 2

1

您可能应该包括UIViewAnimationOptionBeginFromCurrentState在您的动画选项中。

编辑:

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

改变视图center只是改变视图的另一种方式frame。这两个属性更改相同的数据。如果您正在为frame大小设置动画,然后直接通过center(覆盖动画所做的)更改帧,您将无法获得所需的内容。

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

于 2012-05-31T11:08:20.317 回答
0

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

于 2012-06-03T19:35:44.750 回答