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

2020-01-18 18:07:18王冬梅

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


// 显示大图
- (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动画.

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

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


// 收起大图
- (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;
 });
}

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