【问题标题】:How to animate a UIView going off the screen to the right, and then reappearing back from the left如何为 UIView 设置动画,使其向右离开屏幕,然后从左侧重新出现
【发布时间】:2012-01-28 06:25:01
【问题描述】:

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

- (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 动画相互嵌套。这是解决这个问题的唯一方法吗?

【问题讨论】:

    标签: objective-c ios animation uiview


    【解决方案1】:

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

    completion:^(BOOL finished)
    { 
        self.cardView.frame = moveCardToLeftViewFrame; 
    
        [UIView animateWithDuration:0.4 
                         animations:^{self.cardView.frame = initCardViewFrame;}
                         completion:nil];
    }];
    

    注意* moveCardToLeftViewFrame 是一个 CGRect ,它将视图放置在可见窗口的左侧。所以它滑到右边之后,它被放在屏幕的左边,然后滑回到中间。

    【讨论】:

    • 这是获得您想要的东西的最佳方式。嵌套动画确实变得丑陋(缩进地狱!),但它是做你想做的最简单的方法。
    【解决方案2】:

    您可以使用此代码以防万一:

    1. 视图将从屏幕左侧移出并从右侧进入。
    2. 视图将从屏幕右侧移出并从左侧进入。

    代码截图:

    - (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];
                                    }];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-23
      • 2015-06-10
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      相关资源
      最近更新 更多