最近研究了一下颜色的渐变
效果,下面简单抽出一个类的代码,方便查看:
#import <UIKit/UIKit.h>
@interface YXLayerView : UIView
{
CAShapeLayer * _lineLayer,* _maskLayer;
CAGradientLayer * _backgroundLayer;
}
@end
#import "YXLayerView.h"
@implementation YXLayerView
- (instancetype)init
{
self = [super init];
if (self) {
[self inits];
}
return self;
}
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self) {
[self inits];
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self inits];
}
return self;
}
- (void)inits
{
self.backgroundColor = [UIColor grayColor];
self.clipsToBounds = YES;
_maskLayer = [[CAShapeLayer alloc] init];
_backgroundLayer = [[CAGradientLayer alloc] init];
_backgroundLayer.colors = @[(id)[UIColor redColor].CGColor,(id)[UIColor greenColor].CGColor,(id)[UIColor blueColor].CGColor];
_backgroundLayer.startPoint = CGPointMake(0.5, 0);
_backgroundLayer.endPoint = CGPointMake(0.5, 1.0);
[self.layer addSublayer:_backgroundLayer];
_lineLayer = [[CAShapeLayer alloc] init];
_lineLayer.lineCap = kCALineCapRound;
_lineLayer.lineJoin = kCALineJoinRound;
_lineLayer.fillColor = [UIColor clearColor].CGColor;
_lineLayer.strokeColor = [UIColor redColor].CGColor;
_lineLayer.lineWidth = 5.0;
[self.layer addSublayer:_lineLayer];
}
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
CGRect bounds = self.bounds;
CGFloat space = CGRectGetWidth(bounds)/4.0;
CGFloat y = CGRectGetHeight(bounds)/2.0;
UIBezierPath * bezierPath = [UIBezierPath bezierPath];
[bezierPath moveToPoint:CGPointMake(0, y)];
[bezierPath addQuadCurveToPoint:CGPointMake(space, y - 10) controlPoint:CGPointMake(space/2.0, y - 80)];
[bezierPath addQuadCurveToPoint:CGPointMake(2 * space, y - 10) controlPoint:CGPointMake(space + space/2.0, y - 80)];
[bezierPath addQuadCurveToPoint:CGPointMake(3 * space, y - 40) controlPoint:CGPointMake(2 * space + space/2.0, (y - 40)/2.0)];
[bezierPath addQuadCurveToPoint:CGPointMake(4 * space, y) controlPoint:CGPointMake(3 * space + space/2.0, y/2.0)];
_lineLayer.path = bezierPath.CGPath;
_backgroundLayer.frame = bounds;
[bezierPath addLineToPoint:CGPointMake(CGRectGetWidth(bounds), CGRectGetHeight(bounds))];
[bezierPath addLineToPoint:CGPointMake(0, CGRectGetHeight(bounds))];
[bezierPath closePath];
_maskLayer.path = bezierPath.CGPath;
_backgroundLayer.mask = _maskLayer;
}
@end