动画特效二:图片折叠

上一期动画特效,我讲解了《图片翻转》。这一节,我们继续动画之旅,讲解一下图片折叠效果。

图片折叠:顾名思义就是绕着图片的x或者y轴进行折叠,并且看上去有透视效果。先看看最终的效果图:

编程思路分析:

1. 使用一张图片 (Failed) 因为进行图片旋转的时候,如果下半部分的图片往前翻转了,上半部分的图片就会同时往后翻转了。

2. 使用两张图片 (Failed) 通过控制图片的显示与隐藏,但是折叠效果看不出来。

3. 使用一个View(它的大小保持和传递进来的图片大小一致),两张图片,而这两张图片是通过代码裁切,将一张图片裁切为上下两部分,然后分别放置在View的上半部分和下半部分,看起来好像是一张图片(Succeed)。

自定义FoldingView

@interface FoldingView : UIView
- (instancetype)initWithImage:(UIImage *)image;
@end

一、进行初始化工作

- (instancetype)initWithImage:(UIImage *)image {
    if (self = [super init]) {
        self.image = image;
        // 父View的尺寸等于传递过来的图片的尺寸
        self.frame = CGRectMake(0, 0, image.size.width, image.size.height);

        [self addTopView];

        [self addBottomView];

        [self addGestures];
    }
    return self;
}

二、addTopView用来裁切图片的上半部分并且放置在FoldingView的上面。

- (void)addTopView {
    UIImage *topImage = [self cutImageWithOrignalImage:self.image type:LayerSectionTop];

    // 设置图片的frame是父View的frame一半
    self.topImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.bounds), CGRectGetMidY(self.bounds))];

    self.topImageView.userInteractionEnabled = YES;

    self.topImageView.image = topImage;

    // 设置内容模式为ScaleAspectFit,图片不拉伸
    self.topImageView.contentMode = UIViewContentModeScaleAspectFit;

    // 下面设置的position和anchorPoint不写,其实图片已经显示在父控件上面的一半了,但是动画操作的layer是要针对position和anchorPoint的,所以设置他们!!!
    self.topImageView.layer.position = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
    self.topImageView.layer.anchorPoint = CGPointMake(0.5, 1.0);

    self.topImageView.layer.mask = [self maskForSection:LayerSectionTop withRect:self.topImageView.bounds];

    //self.topImageView.layer.transform = CATransform3DMakePerspective(CGPointZero);
    self.topImageView.layer.transform = [self transform3D];
    [self addSubview:self.topImageView];
}

三、裁切图片的方法: cutImageWithOrignalImage:type方法。为了区分是裁切的上半部分还是下半部分的图片,我定义了一个枚举,用来区别。

typedef NS_ENUM(NSInteger, LayerSection){
    LayerSectionTop,
    LayerSectionBottom
};
// 裁切图片的上面一半或者下面一半
- (UIImage *)cutImageWithOrignalImage:(UIImage *)image type:(LayerSection)section {
    CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height * 0.5);
    if (section == LayerSectionBottom) {
        rect.origin.y = image.size.height * 0.5;
    }

    CGImageRef imageRef = CGImageCreateWithImageInRect(image.CGImage, rect);
    UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    return finalImage;
}

然后,我们接着看第二点的代码;有两点我需要说明:1.position和anchorPoint的使用(如果想了解具体使用,请参照我以前写的博客《position和anchorPoint》);
2. 一个View设置部分圆角效果(《Core Animation高级理论知识汇总》中的专用图层有介绍过)。其实,我们完全可以通过设置被裁切图片的frame来控制图片在FoldingView中的显示位置来达到效果,之所以设置position和anchorPoint就是为了后面的折叠效果做准备。下面一张图说明了折叠原理。

四、添加手势

- (void)addGestures {
    UIPanGestureRecognizer *topPan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panTopEvent:)];
    [self.topImageView addGestureRecognizer:topPan];
}

- (void)panTopEvent:(UIPanGestureRecognizer *)recognizer {
    CGPoint location = [recognizer locationInView:self];

    if (recognizer.state == UIGestureRecognizerStateBegan) {
        self.initialLocation = location.y;
        [self bringSubviewToFront:self.topImageView];
    }
    // 上面一半的图片只允许往下拉
    CGFloat delta = location.y - self.initialLocation;
    if (delta < 0) return;

    CGFloat conversionFactor = -M_PI / CGRectGetHeight(self.bounds);
    CGFloat angle = delta * conversionFactor;

    if (angle <= -M_PI) {
        angle = -M_PI;
    }

    self.topImageView.layer.transform = CATransform3DConcat(CATransform3DMakeRotation(angle, 1, 0, 0), [self transform3D]);

    if (recognizer.state == UIGestureRecognizerStateEnded ||
        recognizer.state == UIGestureRecognizerStateCancelled) {
        [UIView animateWithDuration:0.25 animations:^{
            self.topImageView.layer.transform = [self transform3D];
        } completion:^(BOOL finished) {
            //[self shakeTop];
        }];
    }

}
// 透视效果
- (CATransform3D)transform3D {
    CATransform3D transform = CATransform3DIdentity;
    transform.m34 = kPerspective;
    return transform;
}

关于透视效果有什么不明白的,可以参照《CATransform3D
特效详解》

至此,上半部分图片折叠效果已经实现了,而下半部分很相似,我就不再说明了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-01 22:57:32

动画特效二:图片折叠的相关文章

纯CSS3炫酷3D折叠面板动画特效

这是一款效果非常炫酷的CSS3 3D折叠面板动画特效.该折叠面板特效当鼠标移动到图片上时,一个面板会以3d折叠的方式在顶部展开,并显示图片的标题等信息..这个效果使用3D CSS animations 来制作折叠面板的动画,纯CSS,没有使用javascript. 在线演示:http://www.htmleaf.com/Demo/201501251276.html 下载地址:http://www.htmleaf.com/css3/css3donghua/201501251275.html

IOS开发——UI进阶篇(十八)核心动画小例子,转盘(裁剪图片、自定义按钮、旋转)图片折叠、音量震动条、倒影、粒子效果

一.转盘(裁剪图片.自定义按钮.旋转) 1.裁剪图片 将一张大图片裁剪为多张 // CGImageCreateWithImageInRect:用来裁剪图片 // image:需要裁剪的图片 // rect:裁剪图片的尺寸,传递是像素 CGImageRef norImage = CGImageCreateWithImageInRect(norBigImage.CGImage, clipRect); 2.每次点击按钮立马变为选中状态,并且取消上次的按钮的选中状态 当然还要重写- (void)setH

Core Animation一些Demo总结 (动态切换图片、大转盘、图片折叠、进度条等动画效果)

前一篇总结了Core Animation的一些基础知识,这一篇主要是Core Animation 的一些应用,涉及到CAShapeLayer.CAReplicatorLayer等图层的知识. 先看效果图: 1.切换图片:      2.彩票转盘 3.图片折叠 4.进度条旋转 5.粒子效果 一.切换图片 看起来很复杂的动画,通过少量的计算和编码就可以简单的实现.要做到这一步,必须是需要研究iOS开发中的Core Animation和Core Graphics框架的.日常工作中,对于很多东西不求甚解

动画特效一:图片翻转

前几节内容中,我详细的讲解了动画的理论知识及基本使用,在以后的章节中,我将用实际的案例来展示动画特效.这一节的例子是图片翻转.先看看最终效果: 素材准备:提供了两张图片,Baby.png和Xiaoming.png,并且它们的尺寸大小均为150 X 150.图片如下:      设计思路一: 1. 放置一个ContainerView,其尺寸大小也为150 X 150,用于存放图片. 2. 将上面的两张图片均放置在ContainerView中. 3. 进行outlets连线工作. XIB中设计界面如

12种炫酷的CSS3鼠标滑过图片遮罩层动画特效

InContent是一款效果非常炫酷的CSS3鼠标滑过图片遮罩层动画特效.这组特效共有12种不同的鼠标滑过图片效果,分为滑动.旋转和翻转3大类.它可以在支持CSS3 transition和transform属性的现代浏览器中正常工作. 在线预览   源码下载 使用方法 使用该CSS3鼠标滑过图片遮罩层动画特效需要在页面中引入由SASS编译的sass-compiled.css文件或由LESS编译的less-compiled.css文件. <link rel="stylesheet"

CSS3实战开发:仿天猫首页图片展示动画特效实战开发

各位网友大家好,我是陌上花会开,人称陌陌.今天我带领大家开发一个仿天猫首页图片展示动画特效的案例.一如往常,我既不提供源码给大家,也不提供Demo给大家,只是希望大家能跟着我的讲解,然后将代码一步步复制到本地,本人可以保证,页面上的代码复制到本地,绝对百分百运行,且得到与陌陌一样的运行效果.我这么做只为激起大伙的动手能力,望大家能明白我的用心. 好了,不废话了,直接本篇的实战开发吧. 我们看一下我们今天要做的实战案例效果图: 1. 鼠标划过前: 2. 鼠标划过右侧的图片时: 可能大伙看这个静态截

Android Animation动画详解(二): 组合动画特效

前言 上一篇博客Android Animation动画详解(一): 补间动画 我已经为大家介绍了Android补间动画的四种形式,相信读过该博客的兄弟们一起都了解了.如果你还不了解,那点链接过去研读一番,然后再过来跟着我一起学习如何把简单的动画效果组合在一起,做出比较酷炫的动画特效吧. 一. 动画的续播 如题,大家想想,如果一个页面上包含了许多动画,这些动画要求按顺序播放,即一个动画播放完成后,继续播放另一个动画,使得这些动画具有连贯性.那该如何实现呢? 有开发经验或者是逻辑思维的人肯定会想,对

CSS3实战开发: 手把手教大家实战开发鼠标划过图片动画特效

各位网友大家好,我是陌上花会开,当然大家也可以叫我陌陌.今天这篇文章,我将手把手带领大家实战开发一个鼠标划过图片时的动画特效.在这里我不会给大家提供案例的源码下载,但是本人可以保证,只要大家跟着我的思路,一步步将代码复制到本地,一定会得到同样的运行效果.希望大家明白我的用心.好了不废话,直接进入今天的主题吧. 在今天这个案例里,我准备3个素材,一张背景图,两张风景图片.这个大家可以到网上自行下载. 在写代码之前,我先给大家展示一下,动画特效的效果图. 鼠标花过前: 当鼠标划过图片时,图片将逐渐变

10款让人惊叹的HTML5/jQuery图片动画特效

1.HTML5相册照片浏览器 可连接Flickr照片服务 以前我们经常会分享一些jQuery相册浏览插件,效果不错,实用性也很强.不过如果能利用HTML5来实现相册浏览器,那么相册浏览效果肯定会更加炫酷.今天分享的这款HTML5相册浏览器可以连接到Flickr获取照片,也可以连接到youtube获取视频,照片在初始化的时候有波浪般的效果. 在线演示 源码下载 2.CSS3图片模糊效果 今天我们来分享一款利用CSS3技术让图片模糊的效果,我们只需要将鼠标滑过图片,就可以让图片产生模糊的特效,利用C