上篇说道了CAReplicatorLayer的属性和基本用法,接下来利用CAReplicatorLayer来实现一个倒影反射的效果。如图
GitHub地址在layer/CAReplicatorLayer/ReplicatorController里面
指定一个继承于UIView的ReflectionView,它会自动产生内容的反射效果。只需要把ReflectionView的实例放置于Interface Buider,或者代码实现生成ReflectionView的实例,添加到view上。这样就会生成子视图的反射。
ReflectionView.h文件
#import <UIKit/UIKit.h>
@interface ReflectionView : UIView
@end
ReflectionView.m文件
#import "ReflectionView.h"
@implementation ReflectionView
+ (Class)layerClass{
return [CAReplicatorLayer class];
}
-(void)setUp{
// 创建一个replicatorLayer
CAReplicatorLayer * layer = (CAReplicatorLayer *)self.layer;
// 设置重复层个数
layer.instanceCount = 2;
// 设置重复层的transform
CATransform3D transform = CATransform3DIdentity;
// 设置位移量
CGFloat verticalHeight = self.bounds.size.height + 2;
// 设置沿着Y轴位移verticalHeight
transform = CATransform3DTranslate(transform, 0, verticalHeight, 0);
// 设置Y方向缩放-1,
transform = CATransform3DScale(transform, 1, -1, 1);
// 添加transform
layer.instanceTransform = transform;
// 设置重复层的alpha变化
layer.instanceAlphaOffset = -0.6;
}
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self setUp];
}
return self;
}
- (void)awakeFromNib{
[super awakeFromNib];
[self setUp];
}
调用:
1、Interface Buider(图一)
图一
这里一定要注意红色框内,要指定这个view为ReflectionView;
2、代码调用
ReflectionView * view = [[ReflectionView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
view.center = CGPointMake(kWidth/2, kHeight/2-200);
UIImageView * img = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
img.image = [UIImage imageNamed:@"reflection_image"];
[view addSubview:img];
[self.view addSubview:view];
这样就实现了一个倒影反射的效果。参考《ios核心动画高级技巧》一书里面的反射。
网友评论