Как создать CGGradient для моего подкласса UIView? - PullRequest
1 голос
/ 18 июля 2009

Кто-нибудь знает, как создать CGGradient , который заполнит мой взгляд,
мой текущий код такой, и он заполняет UIView красным прямоугольником. Я хочу иметь градиент (например, от черного к серому) вместо прямоугольника:

- (void)drawRect:(CGRect)rect {
    CGContextRef context=UIGraphicsGetCurrentContext();
    CGRect r;
    r.origin.x=0.;
    r.origin.y=0.;
    r.size.width=rect.size.width;   
    r.size.height=rect.size.height; 
    CGContextSetRGBFillColor(context, 1., 0., 0., 1.);
    CGContextFillRect (context,r);  
}

Ответы [ 3 ]

3 голосов
/ 18 июля 2009

В мой ответ на на этот вопрос , я предоставляю код для рисования градиента глянца в UIView. Цвета и позиции рисования можно изменить, чтобы сформировать любой линейный градиент, который вам нужен.

3 голосов
/ 04 августа 2011

это подкласс, где вы можете выбрать цвета

.h файл

#import <UIKit/UIKit.h>

@interface GradientView : UIView {
    CGGradientRef gradient;
}

@property(nonatomic, assign) CGGradientRef gradient;

- (id)initWithGradient:(CGGradientRef)gradient;
- (id)initWithColor:(UIColor*)top bottom:(UIColor*)bot;
- (void)setGradientWithColor:(UIColor*)top bottom:(UIColor*)bot;
- (void)getRGBA:(CGFloat*)buffer;

@end

.m файл

#import "GradientView.h"

@implementation GradientView

@synthesize gradient;

- (id)initWithGradient:(CGGradientRef)grad {
    self = [super init];
    if(self){
        [self setGradient:grad];
    }
    return self;
}

- (id)initWithColor:(UIColor*)top bottom:(UIColor*)bot {
    self = [super init];
    if(self){
        [self setGradientWithColor:top bottom:bot];
    }
    return self;
}

- (void)setGradient:(CGGradientRef)g {
    if(gradient != NULL && g != gradient){
        CGGradientRelease(gradient);
    }
    if(g != gradient){
        CGGradientRetain(g);
    }
    gradient = g;
    [self setNeedsDisplay];
}

- (void)setGradientWithColor:(UIColor*)top bottom:(UIColor*)bot {
    CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
    CGFloat clr[8];
    [top getRGBA:clr];
    [bot getRGBA:clr+4] ;
    CGGradientRef grad = CGGradientCreateWithColorComponents(rgb, clr, NULL, sizeof(clr)/(sizeof(clr[0])*4));
    [self setGradient:grad];
    CGColorSpaceRelease(rgb);
    CGGradientRelease(grad);
}

- (void)getRGBA:(CGFloat*)buffer {
    CGColorRef clr = [self CGColor];
    NSInteger n = CGColorGetNumberOfComponents(clr);
    const CGFloat *colors = CGColorGetComponents(clr);
    // TODO: add other ColorSpaces support
    switch (n) {
        case 2:
            for(int i = 0; i<3; ++i){
                buffer[i] = colors[0];
            }
            buffer[3] = CGColorGetAlpha(clr);
            break;
        case 3:
            for(int i = 0; i<3; ++i){
                buffer[i] = colors[i];
            }
            buffer[3] = 1.0;
            break;

        case 4:
            for(int i = 0; i<4; ++i){
                buffer[i] = colors[i];
            }
            break;
        default:
            break;
    }
}

- (void)drawRect:(CGRect)rect {
    CGContextRef c = UIGraphicsGetCurrentContext();
    CGContextDrawLinearGradient(c, gradient, CGPointMake(0, 0), CGPointMake(0, rect.size.height), 0);
}


- (void)dealloc {
    CGGradientRelease(gradient);
    [super dealloc];
}


@end
2 голосов
/ 18 июля 2009

Используйте CGGradientCreateWithColorComponents или CGGradientCreateWithColors для создания градиента. (Последний принимает объекты CGColor.) Затем используйте CGContextDrawLinearGradient или CGContextDrawRadialGradient , чтобы нарисовать его.

Линейный градиент будет простираться бесконечно по крайней мере в двух направлениях, перпендикулярных линии градиента. Радиальный градиент распространяется бесконечно во всех направлениях. Чтобы предотвратить распространение градиента за пределы вашего вида, вам, вероятно, потребуется добавить границы вида в обтравочный контур, используя CGContextClipToRect .

...