先来看一下倒影的效果,从效果图中可以看出好像图片的下方是图片本身在水中的倒影。其实真正实现起来很简单,核心代码也就那么三五行的事情。
实现上面这样的效果,主要借助于CAReplicatorLayer复制层这个类。所谓的复制层就是可以复制它里面子层(subLayer),但是如果想要复制它里面的内容,也要把它添加到层上面。复制层复制出来的内容也会包含其本身。
首先我们先创建一个工程,然再创建一个继承于UIView类的VCView,然后在VCView类的.m文件中重写一个如下这样的系统方法以及一个初始化initWithFrame:方法。
+ (Class)layerClass{
return [CAReplicatorLayer class];
}
上面这个方法的主要作用是返回当前layer层的一个类型,默认的UIView上层的类型CALayer,但是我们想在ViewController的view上展示倒影效果需要借助CAReplicatorLayer,所以这里重写系统方法,强制改变layer层的类型。然后在ViewController中,实例化VCView的一个对象,并赋给self.view。即:self.view = [[VCView alloc]init]; 主要的目的是将控制的view的层类型设置为复制层。
接着,在控制器view上添加一个UIImageView视图子控件,并设置图片。其中imageView的底部刚好和self.view的竖直方向的中心线在同一条线上(具体原因请继续看下面)。
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(self.view.frame.size.width/2 - 100, self.view.frame.size.height/2 - 300, 200, 300)];
imageView.image = [UIImage imageNamed:@"1.png"];
[self.view addSubview:imageView];
再然后来看看我们的核心代码,先创建一个复制层对象。instanceCount是复制层进行复制,以及复制多少份。instanceTransform是设置复制层复制出来的子层进行旋转,这里有一点要知道:复制层复制出来的子层,都是围绕着复制层的锚点旋转的。而锚点的默认值是0.5,0.5,为了让倒影和原本的图片可以拼接在一起,所以上面imageView的布局会如此。最后的四句代码是设置倒影的颜色以及透明度,视觉上呈现为水中的倒影效果。
CAReplicatorLayer *repL = (CAReplicatorLayer *)self.view.layer;
repL.instanceCount = 2;
repL.instanceTransform = CATransform3DMakeRotation(M_PI, 1, 0, 0);
repL.instanceRedOffset -= 0.2;
repL.instanceBlueOffset -= 0.2;
repL.instanceGreenOffset -= 0.2;
repL.instanceAlphaOffset -= 0.4;
最后再说明一点,self.view = [[VCView alloc]init];这句代码一定要写在添加子控件imageView之前,在添加imageView之前设置层类型。否则的话,不会有效果。