如何动画UIView从屏幕向右移动,然后从左侧重新出现

时间:2011-12-27 02:35:53

标签: objective-c ios animation uiview

我的视图包含在我的应用程序的主视图中(屏幕中间的一个正方形)。我写了下面的代码,如果你向左滑动它,将视图从屏幕右侧滑动:

- (IBAction)swipeLeft:(id)sender
{
    CGRect initCardViewFrame = self.cardView.frame;
    CGRect movedCardToRightViewFrame = CGRectMake(initCardViewFrame.origin.x + 1000, initCardViewFrame.origin.y, initCardViewFrame.size.width, initCardViewFrame.size.height);

    [UIView animateWithDuration:0.7
                     animations:^{self.cardView.frame = movedCardToRightViewFrame;}
                     completion:nil];
}

这很好用,但是我想扩展代码,这样一旦正方形离开屏幕的右侧,它就会从左侧返回到中间。我不太确定如何在窗户左侧“重新画”它,然后将它向后滑动到中间。我试过只重做帧,但动画只显示动画块中的最后一帧移动。我假设我需要将视图从屏幕上移开,然后将其重绘在屏幕左侧的外侧,然后将其滑入中间。除非有更直观的方式来做到这一点。

更新

我在下面回答了这个问题,但我不禁想到,如果不将UIView动画嵌入彼此内部,有更好的方法可以做到这一点。这是解决这个问题的唯一方法吗?

2 个答案:

答案 0 :(得分:4)

我最终在“completion”参数中添加了以下代码:

completion:^(BOOL finished)
{ 
    self.cardView.frame = moveCardToLeftViewFrame; 

    [UIView animateWithDuration:0.4 
                     animations:^{self.cardView.frame = initCardViewFrame;}
                     completion:nil];
}];

注意* moveCardToLeftViewFrame是一个CGRect,它将视图放在可见窗口的左侧。因此,当它向右滑动后,它被放置在屏幕左侧,然后滑回中间。

答案 1 :(得分:0)

您可以在以下情况下使用此代码:

  1. 视图将在屏幕外显示为Left并从右边进入。
  2. 视图将在屏幕外显示为Right并从左边进入。
  3. 代码狙击:

    - (void)animateViewWithTransformation:(MyEnumAnimationTransformation)animationTransformation withDuration:(CGFloat)duration {
        CGFloat goOutOffScreenToX, cameInToScreenFromX;
        switch (animationTransformation) {
            case goOutToLeftGetInFromRight:
                goOutOffScreenToX = -1 * [UIScreen mainScreen].applicationFrame.size.width;
                cameInToScreenFromX = [UIScreen mainScreen].applicationFrame.size.width;
                break;
            case goOutToRightGetInFromLeft:
                goOutOffScreenToX = [UIScreen mainScreen].applicationFrame.size.width;
                cameInToScreenFromX = -1 * [UIScreen mainScreen].applicationFrame.size.width;
                break;
            default:
                break;
        }
    
        CGRect originViewFrame = self.frame;
        [UIView animateWithDuration:duration
                         animations:^{[self setX:goOutOffScreenToX];}
                         completion:^(BOOL finished)
                                    { 
                                        [self setX:cameInToScreenFromX];
                                        [UIView animateWithDuration:duration
                                                         animations:^{[self setX:originViewFrame.origin.x];}
                                                         completion:nil];
                                    }];
    }