Рисование простого линейного градиента внутри прямоугольника внутри вида - PullRequest
1 голос
/ 12 февраля 2011

Я читаю документацию о градиентах и ​​немного растерялся. У меня есть вид, и внутри него я просто хочу нарисовать простой линейный градиент от черного к серому внутри прямоугольника (меньше, чем вид) снизу вверх. Как я могу сделать это без создания подкласса (я прочитал много вещей, которые должны создать подкласс представления)?

Я ищу способ сделать это так просто, как я когда-либо делал на разных платформах. Что-то вроде (без языка :-)):

blackcolor = MakeBlack();
whiteColor = MakeWhite();

startPoint = MakeStartPoint();
endPoint = MakeEndPoint();

onthisgraphicport = SetGraphicPort(self.view);
clippingRect = MakeClipRect();

DrawGradient(from:whiteColor, to:blackcolor, from:startPoint, to:endPoint, onthisgraphicport, intoThisRect:clippingRect);

Спасибо за вашу помощь.

1 Ответ

5 голосов
/ 13 февраля 2011

Этот фрагмент кода может помочь.Я нашел код некоторое время назад в Интернете.К сожалению, я забыл сайт, поэтому не уверен, кому отдать должное.

Код как таковой рисует градиент от белого к черному.Просто измените прямоугольник и цвета в соответствии с вашими потребностями.

@interface MyView : UIView {
    CGGradientRef _gradientRef;
}

@end

@implementation MyView

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

- (id) initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
        CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
        CGFloat colors[] =
        {
            1.0f, 1.0f, 1.0f, 1.0f,
            0.0f, 0.0f, 0.0f, 1.0f,
        };
        _gradientRef = CGGradientCreateWithColorComponents(rgb, colors, NULL, sizeof(colors) / (sizeof(colors[0]) * 4));
        CGColorSpaceRelease(rgb);
    }

    return self;
}

- (void) drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGPoint start = rect.origin;
    start.y = 0;
    CGPoint end = CGPointMake(rect.origin.x, rect.size.height);
    CGContextDrawLinearGradient(context, _gradientRef, start, end, kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);

    [super drawRect:rect];
}

@end
...