服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS点击查看大图的动画效果

iOS点击查看大图的动画效果

2021-02-21 14:41Cloudox_ IOS

这篇文章主要为大家详细介绍了iOS点击查看大图的动画效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

对于图片来说,除了表情包,几乎都会被点击查看大图。今天就讲解一个查看和收起大图的动画效果,先直接看效果图:

iOS点击查看大图的动画效果

如图所示,最开始是一个小图,点击小图可以查看大图。大图会从小图的位置和大小“弹”出来,同时背景变成半透明的阴影。点击大图或者阴影后,收起大图,同样地弹回到小图去,同时去掉阴影背景,就像是一张图片在伸大缩小一样。

现在看看这是怎么实现的。在思考一个动画的实现方法时,把动画的动作进行分解然后再一个个去思考怎么实现是一个好的习惯,我们稍微分解一下,这个动画在显示大图和收起大图的时候做了这些事情:

  • 打开时先显示一个半透明的阴影背景;
  • 然后显示一个逐渐变大的图片,直到撑到屏幕的边界;
  • 收起时先让阴影背景消失;
  • 然后将图片逐渐收小到小图原本的大小。

这样看其实还蛮简单的,下面看代码怎么实现。

首先我们定义三个属性,因为我们需要在多个方法中调用,所以定义为类的@property:

?
1
2
3
@property (nonatomic, strong) uiimageview *smallimageview;// 小图视图
@property (nonatomic, strong) uiimageview *bigimageview;// 大图视图
@property (nonatomic, strong) uiview *bgview;// 阴影视图

然后我们将小图片直接添加到界面上去:

?
1
2
3
4
5
6
7
8
9
10
11
12
- (void)viewdidload {
 [super viewdidload];
 
 // 小图
 self.smallimageview = [[uiimageview alloc] initwithframe:cgrectmake((screenwidth - 100)/2, (screenheight - 100)/2, 100, 100)];
 self.smallimageview.image = [uiimage imagenamed:@"icon"];
 // 添加点击响应
 self.smallimageview.userinteractionenabled = yes;
 uitapgesturerecognizer *imagetap = [[uitapgesturerecognizer alloc] initwithtarget:self action:@selector(viewbigimage)];
 [self.smallimageview addgesturerecognizer:imagetap];
 [self.view addsubview:self.smallimageview];
}

注意这里我在设置小图的大小时用到了两个事先设好的常量:屏幕的高和宽,这样就会根据手机的屏幕大小来保证图片始终是居中显示的,关于这两个常量,可以查看我这篇博客:ios获取屏幕宽高、设备型号、系统版本信息

好现在小图已经添加到界面上了,我们也给小图添加了响应点击的方法,只需要在响应方法中实现动画就可以了。但是在这之前,我们先来完成大图片和阴影背景的初始化:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 大图视图
- (uiimageview *)bigimageview {
 if (nil == _bigimageview) {
 _bigimageview = [[uiimageview alloc] initwithframe:cgrectmake(0, (screenheight - screenwidth) / 2, screenwidth, screenwidth)];
 [_bigimageview setimage:self.smallimageview.image];
 // 设置大图的点击响应,此处为收起大图
 _bigimageview.userinteractionenabled = yes;
 uitapgesturerecognizer *imagetap = [[uitapgesturerecognizer alloc] initwithtarget:self action:@selector(dismissbigimage)];
 [_bigimageview addgesturerecognizer:imagetap];
 }
 return _bigimageview;
}
 
// 阴影视图
- (uiview *)bgview {
 if (nil == _bgview) {
 _bgview = [[uiview alloc] initwithframe:cgrectmake(0, 0, screenwidth, screenheight)];
 _bgview.backgroundcolor = [uicolor colorwithwhite:0 alpha:0.5];
 // 设置阴影背景的点击响应,此处为收起大图
 _bgview.userinteractionenabled = yes;
 uitapgesturerecognizer *bgtap = [[uitapgesturerecognizer alloc] initwithtarget:self action:@selector(dismissbigimage)];
 [_bgview addgesturerecognizer:bgtap];
 }
 return _bgview;
}

可以看到我们单独使用了两个方法来初始化大图和阴影背景,大图的大小设为了垂直居中,宽度正好与屏幕一致,高度与宽度相同,是个正方形。阴影背景则是占据整个屏幕。同时,我也设置了两个视图的点击相应方法,都是收起大图的动画方法,我们之后再去实现。现在,我们可以来着手实现显示大图的动画了。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 显示大图
- (void)viewbigimage {
 [self bigimageview];// 初始化大图
 
 // 让大图从小图的位置和大小开始出现
 cgrect originfram = _bigimageview.frame;
 _bigimageview.frame = self.smallimageview.frame;
 [self.view addsubview:_bigimageview];
 
 // 动画到大图该有的大小
 [uiview animatewithduration:0.3 animations:^{
 // 改变大小
 _bigimageview.frame = originfram;
 // 改变位置
 _bigimageview.center = self.view.center;// 设置中心位置到新的位置
 }];
 
 // 添加阴影视图
 [self bgview];
 [self.view addsubview:_bgview];
 
 // 将大图放到最上层,否则会被后添加的阴影盖住
 [self.view bringsubviewtofront:_bigimageview];
}

看代码,我们首先调用了大图的初始化方法,但是注意,此时还并没有将大图添加到界面上,如果这时候添加,就会直接显示大图了,在此之前,我们先保存了大图自身的尺寸,然后将其尺寸位置设为和小图完全一样,然后才将它添加到界面上,从小图的位置和尺寸,去动画到大图原本的尺寸,看起来就像是小图放大成了大图一样对吧。这里的动画我们使用的是最简单的ios 7开始支持的基于block的uiview动画,在我的这篇博客中也有详细讲解:ios基础动画教程

然后,我们初始化了阴影背景视图,并添加到界面上,此时不要忘记,要再次将大图手动推送到最上层,否则是会被后添加的阴影视图覆盖的。

到此,显示大图的动画就结束了,挺简单的吧,接下来我们看收起大图的动画,基本就是把上面的步骤倒过来了一次。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 收起大图
- (void)dismissbigimage {
 [self.bgview removefromsuperview];// 移除阴影
 
 // 将大图动画回小图的位置和大小
 [uiview animatewithduration:0.3 animations:^{
 // 改变大小
 _bigimageview.frame = self.smallimageview.frame;
 // 改变位置
 _bigimageview.center = self.smallimageview.center;// 设置中心位置到新的位置
 }];
 
 // 延迟执行,移动回后再消灭掉
 double delayinseconds = 0.3;
 __block viewcontroller* bself = self;
 dispatch_time_t poptime = dispatch_time(dispatch_time_now, (int64_t)(delayinseconds * nsec_per_sec));
 dispatch_after(poptime, dispatch_get_main_queue(), ^(void){
 [bself.bigimageview removefromsuperview];
 bself.bigimageview = nil;
 bself.bgview = nil;
 });
}

我们先移除阴影背景,然后将大图动画回小图的尺寸和位置,看起来就像是缩小成了小图一样。然后我们使用了一个延迟函数,确保在图片收缩回小图以后,再将图片移除界面,保证动画的效果。

至此,就完成了我们整个的动画了。这个例子中图片是中规中矩地放在居中位置,你也可以试一下将小图放在其他位置,其实真实的app中很少有居中放置的,从别的地方伸缩放大缩小效果会更加有趣的。当然了,如果小图的位置不好获取,那就直接设为从屏幕的中点开始缩放,效果也不错。另外,你可能会疑惑为什么我要另行添加一个大图的对象,而不直接对小图的尺寸进行动画呢?其实是完全可以的,只是在我的工程中有这个需求,所以我就直接拿过来讲了哈哈哈。

这里是我的示例工程:https://github.com/cloudox/viewbigimagedemo

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://blog.csdn.net/st646889325/article/details/53130410

延伸 · 阅读

精彩推荐
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01