Iphone 在拖动时设置UIView的动画

Iphone 在拖动时设置UIView的动画,iphone,ios,animation,uiview,uipangesturerecognizer,Iphone,Ios,Animation,Uiview,Uipangesturerecognizer,我试图在用户开始拖动UIView时为其展开设置动画,并在用户停止拖动时为其折叠设置动画。在iOS5中,这似乎可行,但并不完美-视图在展开时设置移动到当前手指位置的动画(如此滞后),但在展开动画完成时效果良好 在iOS4中,它只是被破坏了——视图会以动画的形式展开,但在动画完成之前,用户的手指根本不会移动 我能做什么 - (void)gestureRecognizerMoved:(id)sender { [self.view bringSubviewToFront:[(UIPanGestu

我试图在用户开始拖动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中仍然会遇到同样的问题。

您可能应该在动画选项中包含
UIViewAnimationOptionBeginFromCurrentState

编辑:

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

更改视图
中心
只是更改视图
的另一种方式。这两个属性更改相同的数据。如果正在设置
大小的动画,然后直接通过
中心
更改帧(覆盖动画的功能),则无法获得所需的效果


我看到的easist解决方案是将您的视图放入一个透明容器中,并在视图仍然可以设置其大小动画的情况下更改容器的位置。

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

尝试了此操作,但没有工作。据我所知,UIViewAnimationOptionBeginFromCurrentState将用于在视图已设置动画时设置视图动画(因此它不会从其实际位置开始第二个动画,但在第一个动画中它是插值位置),对吗?在我的例子中,我只做了一个动画,同时手动移动帧中心。对不起,我没有注意到您正在直接更改
中心。请参阅更新的答案。您是否尝试将UIViewAnimationOptionAllowUserInteraction作为动画选项?这很有效,谢谢!如果这是一条评论,有没有办法让我接受这个答案?我把它作为一个答案贴了出来