动画特效一:图片翻转

本人录制技术视频地址:https://edu.csdn.net/lecturer/1899 欢迎观看。

前几节内容中,我详细的讲解了动画的理论知识及基本使用,在以后的章节中,我将用实际的案例来展示动画特效。这一节的例子是图片翻转。先看看最终效果:


素材准备:提供了两张图片,Baby.png和Xiaoming.png,并且它们的尺寸大小均为150 X 150。图片如下:

    


设计思路一:

1. 放置一个ContainerView,其尺寸大小也为150 X 150,用于存放图片。

2. 将上面的两张图片均放置在ContainerView中。

3. 进行outlets连线工作。

XIB中设计界面如下图:


编程思路:

1. 设计一个变量front,用于判断当前显示的是哪一张图片。

2. 初始化的时候,将后面的图片绕着y轴旋转180度,达到镜像的效果,这样的话,等旋转到前面的时候,就是正面显示了。

3. 执行UIView的block动画操作,完成翻转效果。

代码:

1. front变量:

@property (nonatomic,assign,getter = isFront) BOOL front;

2. 初始化工作:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.backImageView.layer.cornerRadius = 75;
    self.backImageView.layer.masksToBounds = YES;
    
    self.frontImageView.layer.cornerRadius = 75;
    self.frontImageView.layer.masksToBounds = YES;
    self.backImageView.layer.transform = CATransform3DMakeRotation(M_PI, 0, 1, 0);
    
    self.front = YES;
}


首先设置图片的显示效果为圆形,即cornerRadius的大小为图片宽度的一半; 初始化front的值,表示默认显示前面的图片;关键的一句
self.backImageView.layer.transform = CATransform3DMakeRotation(M_PI, 0, 1, 0);

我们可以使用view debugger来分析层次结构。

先看正面图:


可以看出有五层: (UIWindow, UIView, UIContainerView, backImageView, frontImageView).

然后再看看背面图:

Baby.png这张图片和我文章开头列出的头像方向是一致的,而我们此时是从背面看过去的,说明CATransform3DMakeRotation的确将图片进行了翻转了180度的工作。

3. 动画最终实现的代码:

[UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
        self.rotateView.layer.transform = CATransform3DRotate(self.rotateView.layer.transform, M_PI_2, 0, 1, 0);
    } completion:^(BOOL finished) {
        if(self.isFront){
            self.frontImageView.hidden = YES;
            self.backImageView.hidden = NO;
            self.front = NO;
        }
        else{
            self.frontImageView.hidden = NO;
            self.backImageView.hidden = YES;
            self.front = YES;
        }
        
        [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
            self.rotateView.layer.transform = CATransform3DRotate(self.rotateView.layer.transform, M_PI_2, 0, 1, 0);
        } completion:nil];
    }];

大致的思路就是先将图片旋转90度,达到这个点的时候,立刻将当前图片隐藏,将背面图片显示,并且将front变量的值进行取反工作。然后紧接着在进行旋转90度的操作工作。


设计思路二:

直接使用系统自带的transitionWithView实现动画效果。

XIB中设计界面如下图:


注意到,此时ContainerView中只存放一张图片,而图片的切换工作,都交给了系统自带的功能来完成了。

此时,动画的实现代码如下:

[UIView transitionWithView:self.containerView duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{
            self.iconView.image = [UIImage imageNamed:@"Baby"];
        } completion:^(BOOL finished) {
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                [UIView transitionWithView:self.containerView duration:1.0 options:UIViewAnimationOptionTransitionFlipFromRight animations:^{
                    self.iconView.image = [UIImage imageNamed:@"Xiaoming"];
                } completion:nil];
            });
        }];

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋恨雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值