可以看到我们单独使用了两个方法来初始化大图和阴影背景,大图的大小设为了垂直居中,宽度正好与屏幕一致,高度与宽度相同,是个正方形。阴影背景则是占据整个屏幕。同时,我也设置了两个视图的点击相应方法,都是收起大图的动画方法,我们之后再去实现。现在,我们可以来着手实现显示大图的动画了。
// 显示大图
- (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;
});
}
我们先移除阴影背景,然后将大图动画回小图的尺寸和位置,看起来就像是缩小成了小图一样。然后我们使用了一个延迟函数,确保在图片收缩回小图以后,再将图片移除界面,保证动画的效果。










