理解[UIView animateWithDuration:completion:]的完成块

时间:2012-11-13 04:38:50

标签: ios uiview uipangesturerecognizer

我正在努力理解UIView animateWithDuration:completion。我想要做的是将UIView拖入另一个UIView。如果它们相交,则将拖动UIView的alpha设置为0,然后将拖动UIView重置为其原始位置。想法是将项目拖放到桶中。首先,我只是将alpha设置为0,然后重置它。这是我对拖动视图的平移手势识别器的代码:

else if (gestureRecognizer.state == UIGestureRecognizerStateEnded) {
        // Update the description view
        if (CGRectIntersectsRect(panViewPiece.frame, _descriptionView.frame)) {
            [UIView animateWithDuration:0.25 animations:^{
                self.dragDescriptionView.alpha = 0.0;
            }completion:^(BOOL finished) {
                if (finished) {
                    panViewPiece.center = _dragDescriptionViewOriginalCenter;
                    self.dragDescriptionView.alpha = 1.0;
                }
            }];
            [self updateDescriptionView];
        }
}

所以我认为完成块的工作方式是第一个animateWithDuration完成后,将调用完成块。所以我试图在第一部分将alpha设置为0,然后一旦完成,将panViewPiece放回原来的位置并将其alpha设置为1.在rects相交后,alpha变为0然后回到1,因为它快速回到原来的中心。我不希望视图在捕捉到原始位置时可见。我是否正确理解完成块?或者这不是它的工作方式吗?谢谢!

2 个答案:

答案 0 :(得分:0)

在完成块中,您将dragDescriptionView的alpha设置回1.0,然后将其设置为0.0。那是你要的吗?在您的问题中,听起来您希望panViewPiece的alpha值为1.0,但这不是您的代码所做的。

答案 1 :(得分:0)

我不太清楚你所看到的是什么 - 对于alpha 0的淡入淡出可以正常工作,但是你说它在返回到原始位置之前再次可见?它是否有动画回到可见或动画回原位?

如果它刚出现,然后突然回到正确的位置,那么我的猜测是你的动画块完成之前,其他一些代码(你的问题中没有显示)将alpha设置回1 - 你做的意识到UIView块动画调用是异步的,所以下面的代码将在动画执行之前或期间执行?