在drawRect中向UIView添加渐变 [英] adding gradient to UIView in drawRect

查看:163
本文介绍了在drawRect中向UIView添加渐变的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

   - (void)drawRect:在我的drawRect中添加一个CAGradientLayer,代码如下: (CGRect)rect {

CAGradientLayer * gradientOverlay = [CAGradientLayer图层];
CGColorRef grayColor = [UIColor colorWithRed:37 / 255.f green:37 / 255.f
blue:37 / 255.f alpha:1.0] .CGColor;
CGColorRef blueColor = [UIColor colorWithRed:23.0 / 255.0 green:171.0 / 255.0
blue:219.0 / 255.0 alpha:1.0] .CGColor;
gradientOverlay.colors = [NSArray arrayWithObjects:
(id)grayColor,
(id)grayColor,
(id)blueColor,
nil];
gradientOverlay.locations = [NSArray arrayWithObjects:
[NSNumber numberWithFloat:0],
[NSNumber numberWithFloat:0.4],
[NSNumber numberWithFloat:1],
nil ]。

CGPoint startPoint = CGPointMake(CGRectGetMinX(rect),CGRectGetMidY(rect));
CGPoint endPoint = CGPointMake(CGRectGetMaxX(rect),CGRectGetMidY(rect));

gradientOverlay.startPoint = startPoint;
gradientOverlay.frame = self.bounds;
gradientOverlay.endPoint = endPoint;

self.layer.mask = gradientOverlay;

}

任何想法为什么这不起作用?

解决方案添加您的 CAGradientLayer 作为您的 self的子图层。层
-
注意:如果您在 drawRect:方法中执行此操作,请确保您每次调用 drawRect:时,不添加新的 CAGradientLayer



 

code> //创建一个保存背景图片的图层,并将其添加为self.layer的子图层
CALayer * layer = [CALayer图层];
layer.frame = self.layer.frame;
layer.contents =(id)[UIImage imageNamed:@background.png]。CGImage;
[self.layer addSublayer:layer];

//创建您的CAGradientLayer
CAGradientLayer * gradientOverlay = [CAGradientLayer图层];
CGColorRef grayColor = [UIColor colorWithRed:37 / 255.f green:37 / 255.f
blue:37 / 255.f alpha:1.0] .CGColor;
CGColorRef blueColor = [UIColor colorWithRed:23.0 / 255.0 green:171.0 / 255.0
blue:219.0 / 255.0 alpha:1.0] .CGColor;
gradientOverlay.colors = [NSArray arrayWithObjects:
(id)grayColor,
(id)grayColor,
(id)blueColor,
nil];
gradientOverlay.locations = [NSArray arrayWithObjects:
[NSNumber numberWithFloat:0],
[NSNumber numberWithFloat:0.4],
[NSNumber numberWithFloat:1],
nil ]。

CGPoint startPoint = CGPointMake(CGRectGetMinX(rect),CGRectGetMidY(rect));
CGPoint endPoint = CGPointMake(CGRectGetMaxX(rect),CGRectGetMidY(rect));

gradientOverlay.startPoint = startPoint;
gradientOverlay.frame = self.layer.frame;
gradientOverlay.endPoint = endPoint;
//将其不透明度设置为0〜1
gradientOverlay.opacity = 0.6f;
//将它添加为self.layer的子图层(它将在背景图像
[self.layer addSublayer:gradientOverlay];

注意:您不必在 drawRect:方法在 init 方法中创建图层层次结构,例如,如果需要更改某些视图/图层的几何图元,请覆盖 layoutSubviews 方法。

I am trying to add a CAGradientLayer in my drawRect, the code is the following:

- (void)drawRect:(CGRect)rect {

    CAGradientLayer *gradientOverlay = [CAGradientLayer layer];
    CGColorRef grayColor = [UIColor colorWithRed:37/255.f green:37/255.f 
                                            blue:37/255.f alpha:1.0].CGColor; 
    CGColorRef blueColor = [UIColor colorWithRed:23.0/255.0 green:171.0/255.0 
                                            blue:219.0/255.0 alpha:1.0].CGColor;
    gradientOverlay.colors = [NSArray arrayWithObjects:
                              (id) grayColor,
                              (id) grayColor,
                              (id) blueColor,
                              nil];
    gradientOverlay.locations = [NSArray arrayWithObjects:
                                 [NSNumber numberWithFloat:0],
                                 [NSNumber numberWithFloat:0.4],
                                 [NSNumber numberWithFloat:1],
                                 nil];

    CGPoint startPoint = CGPointMake(CGRectGetMinX(rect), CGRectGetMidY(rect));
    CGPoint endPoint = CGPointMake(CGRectGetMaxX(rect), CGRectGetMidY(rect));

    gradientOverlay.startPoint = startPoint;
    gradientOverlay.frame = self.bounds;
    gradientOverlay.endPoint = endPoint;

    self.layer.mask = gradientOverlay;

}

Any idea why this is not working?

解决方案

Add your CAGradientLayer as a sublayer of your self.layer.
Note: If you're doing it in the drawRect: method make sure you're not adding a new CAGradientLayer every time drawRect: is called.

UPDATE (regarding the comment): Here's the code for what you're asking:

    //Create a layer that holds your background image and add it as sublayer of your self.layer
    CALayer *layer = [CALayer layer];
    layer.frame = self.layer.frame;
    layer.contents = (id)[UIImage imageNamed:@"background.png"].CGImage;
    [self.layer addSublayer:layer];

//Create your CAGradientLayer
    CAGradientLayer *gradientOverlay = [CAGradientLayer layer];
    CGColorRef grayColor = [UIColor colorWithRed:37/255.f green:37/255.f 
                                            blue:37/255.f alpha:1.0].CGColor; 
    CGColorRef blueColor = [UIColor colorWithRed:23.0/255.0 green:171.0/255.0 
                                            blue:219.0/255.0 alpha:1.0].CGColor;
    gradientOverlay.colors = [NSArray arrayWithObjects:
                              (id) grayColor,
                              (id) grayColor,
                              (id) blueColor,
                              nil];
    gradientOverlay.locations = [NSArray arrayWithObjects:
                                 [NSNumber numberWithFloat:0],
                                 [NSNumber numberWithFloat:0.4],
                                 [NSNumber numberWithFloat:1],
                                 nil];

    CGPoint startPoint = CGPointMake(CGRectGetMinX(rect), CGRectGetMidY(rect));
    CGPoint endPoint = CGPointMake(CGRectGetMaxX(rect), CGRectGetMidY(rect));

    gradientOverlay.startPoint = startPoint;
    gradientOverlay.frame = self.layer.frame;
    gradientOverlay.endPoint = endPoint;
//set its opacity from 0 ~ 1
    gradientOverlay.opacity = 0.6f;
//add it as sublayer of self.layer (it will be over the layer with the background image
    [self.layer addSublayer:gradientOverlay];

Note: You don't have to do this in drawRect: method. Create your layer hierarchy in the init method for example, if you need to change the geometry of some views/layers override the layoutSubviews method.

这篇关于在drawRect中向UIView添加渐变的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆