Как добавить радиальный градиент в UIView? - PullRequest
14 голосов
/ 14 ноября 2011

У меня есть UIView, который я хочу иметь радиальный градиент, и мне интересно, как это сделать?

Ответы [ 5 ]

16 голосов
/ 19 февраля 2016

Первый подкласс UIView:

@implementation UIRadialView

- (void)drawRect:(CGRect)rect
{
    // Setup view
    CGFloat colorComponents[] = {0.0, 0.0, 0.0, 1.0,   // First color:  R, G, B, ALPHA (currently opaque black)
                                 0.0, 0.0, 0.0, 0.0};  // Second color: R, G, B, ALPHA (currently transparent black)
    CGFloat locations[] = {0, 1}; // {0, 1) -> from center to outer edges, {1, 0} -> from outer edges to center
    CGFloat radius = MIN((self.bounds.size.height / 2), (self.bounds.size.width / 2));
    CGPoint center = CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2);

    // Prepare a context and create a color space
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    // Create gradient object from our color space, color components and locations
    CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colorComponents, locations, 2);

    // Draw a gradient
    CGContextDrawRadialGradient(context, gradient, center, 0.0, center, radius, 0);
    CGContextRestoreGState(context);

    // Release objects
    CGColorSpaceRelease(colorSpace);
    CGGradientRelease(gradient);
}

@end

А затем добавьте его в свой вид:

UIRadialView *radialView = [[UIRadialView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
radialView.backgroundColor = [UIColor redColor];
[self.view addSubview:radialView];

Результат:

Radial gradient view

14 голосов
/ 09 января 2017

Swift 3 - @ IBDesignable

Я отработал ответы Карлиса и Александра.Я стремился максимально упростить.Например, удаление цветового пространства и местоположений (nil), чтобы градиент использовал значения по умолчанию.

Как использовать

Шаг 1

Создайте файл и добавьте этот код: importUIKit

@IBDesignable
class RadialGradientView: UIView {

    @IBInspectable var InsideColor: UIColor = UIColor.clear
    @IBInspectable var OutsideColor: UIColor = UIColor.clear

    override func draw(_ rect: CGRect) {
        let colors = [InsideColor.cgColor, OutsideColor.cgColor] as CFArray
        let endRadius = min(frame.width, frame.height) / 2
        let center = CGPoint(x: bounds.size.width / 2, y: bounds.size.height / 2)
        let gradient = CGGradient(colorsSpace: nil, colors: colors, locations: nil)
        UIGraphicsGetCurrentContext()!.drawRadialGradient(gradient!, startCenter: center, startRadius: 0.0, endCenter: center, endRadius: endRadius, options: CGGradientDrawingOptions.drawsBeforeStartLocation)
    }
}

Шаг 2

На раскадровке установите для UIView значение выше RadialGradientView в Инспекторе идентичности: Custom Class

Шаг3

Установите внутренний цвет и внешний цвет для вашего градиента в Инспекторе атрибутов и просмотрите изменения на раскадровке: Radial Gradient

(Примечание: я сделал UIViewна раскадровке достаточно большой, чтобы он заполнил весь

6 голосов
/ 27 октября 2016

Вот ответ Карлиса в Swift 3:

override func draw(_ rect: CGRect) {

    // Setup view
    let colors = [UIColor.white.cgColor, UIColor.black.cgColor] as CFArray
    let locations = [ 0.0, 1.0 ] as [CGFloat]
    let radius = min((self.bounds.size.height / 2), (self.bounds.size.width / 2))
    let center = CGPoint.init(x: self.bounds.size.width / 2, y: self.bounds.size.height / 2)

    // Prepare a context and create a color space
    let context = UIGraphicsGetCurrentContext()
    context!.saveGState()
    let colorSpace = CGColorSpaceCreateDeviceRGB()

    // Create gradient object from our color space, color components and locations
    let gradient = CGGradient.init(colorsSpace: colorSpace, colors: colors, locations: locations)

    // Draw a gradient
    context!.drawRadialGradient(gradient!, startCenter: center, startRadius: 0.0, endCenter: center, endRadius: radius, options: CGGradientDrawingOptions(rawValue: 0))
    context?.restoreGState()
}
6 голосов
/ 14 ноября 2011

Для этого вам нужно перейти в Core Graphics и использовать CGContextDrawRadialGradient .

Похожие вопросы о переполнении стека

Как нарисовать сектор с радиальным градиентом (iphone)

Как нарисовать градиентную линию (исчезновение / исчезновение) с Core Graphics / iPhone?

Другие ресурсы

Здесь есть учебник, показывающий, как рисовать иконки с градиентами на iOS:

http://redartisan.com/2011/05/13/porting-iconapp-core-graphics

Он поместил код на Github, в комплекте с подклассом UIView, который показывает (довольно длинный) способ создания градиентов с использованием Core Graphics:

https://github.com/crafterm/IconApp/blob/master/IconApp/IconView.m

1 голос
/ 28 июля 2017

Вот ответ Карлиса на c # для Xamarin.iOS. Здесь я указываю цвета напрямую, но вы, конечно, можете реализовать их так же, как это сделал Карлис.

public class RadialView : UIView
{
    public RadialView(CGRect rect) : base (rect)
    {
        this.BackgroundColor = UIColor.DarkGray;
    }

    public override void Draw(CGRect rect)
    {
        CGColor[] colorComponents = { UIColor.DarkGray.CGColor, UIColor.LightGray.CGColor };
        var locations = new nfloat[]{ 1, 0 }; 
        var radius = this.Bounds.Size.Height / 2;
        CGPoint center = new CGPoint(this.Bounds.Size.Width / 2, this.Bounds.Size.Height / 2);

        var context = UIGraphics.GetCurrentContext();
        context.SaveState();
        var colorSpace = CGColorSpace.CreateDeviceRGB();

        CGGradient gradient = new CGGradient(colorSpace, colorComponents, locations);
        context.DrawRadialGradient(gradient, center, 0, center, radius, CGGradientDrawingOptions.None);

        context.RestoreState();
        colorSpace.Dispose();
        gradient.Dispose();
    }
}
...