ios 在ios中在图像上绘制渐变

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22810839/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-30 23:53:29  来源:igfitidea点击:

Drawing gradient over image in ios

iosobjective-cgradientlayer

提问by user2823044

How to create gradient colour look like following image programatically.

如何以编程方式创建如下图所示的渐变色。

enter image description here

在此处输入图片说明

回答by Rob

When you say "apply it over the image as a gradient", do you mean as a mask (revealing the image at the top, having it fade the image to transparent at the bottom)? If that's the case, you can apply that gradient as a mask, using CAGradientLayer:

当你说“将它作为渐变应用在图像上”时,你的意思是作为一个蒙版(在顶部显示图像,让它在底部将图像淡化为透明)?如果是这种情况,您可以使用该渐变作为蒙版应用CAGradientLayer

CAGradientLayer *gradientMask = [CAGradientLayer layer];
gradientMask.frame = self.imageView.bounds;
gradientMask.colors = @[(id)[UIColor whiteColor].CGColor,
                        (id)[UIColor clearColor].CGColor];
self.imageView.layer.mask = gradientMask;


The above does a simple vertical gradient (because the default is vertical, linear gradient). But you asked about startPoint, endPoint, and locations. If for example, you wanted your mask applied horizontally, you would do:

上面做了一个简单的垂直渐变(因为默认是垂直、线性渐变)。但是你问的是startPoint, endPoint, 和locations。例如,如果您希望水平应用蒙版,则可以执行以下操作:

gradientMask.startPoint = CGPointMake(0.0, 0.5);   // start at left middle
gradientMask.endPoint = CGPointMake(1.0, 0.5);     // end at right middle

If you wanted to have two gradients, one at the first 10% and another at the last 10%, you'd do:

如果你想有两个渐变,一个在前 10%,另一个在最后 10%,你可以这样做:

gradientMask.colors = @[(id)[UIColor clearColor].CGColor,
                        (id)[UIColor whiteColor].CGColor,
                        (id)[UIColor whiteColor].CGColor,
                        (id)[UIColor clearColor].CGColor];
gradientMask.locations = @[@0.0, @0.10, @0.90, @1.0];


If you want a simple gradient by itself (not as a mask), you'd create a viewand then add the gradient layer to it:

如果您想要一个简单的渐变本身(而不是作为蒙版),您可以创建一个view,然后向其添加渐变图层:

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = view.bounds;
gradient.colors = @[(id)[UIColor whiteColor].CGColor,
                    (id)[UIColor blackColor].CGColor];
[view.layer addSublayer:gradient];

See the CAGradientLayerclass reference.

请参阅CAGradientLayer类参考

回答by RyuX51

I just wrote an UIImage extension for Swift 2.0. Maybe it's of some use. You call it with an array of UIColor (any number) and a frame where the gradient should be drawn.

我刚刚为 Swift 2.0 编写了一个 UIImage 扩展。或许有点用 您可以使用 UIColor 数组(任意数字)和应绘制渐变的框架来调用它。

extension UIImage {

    class func convertGradientToImage(colors: [UIColor], frame: CGRect) -> UIImage {

        // start with a CAGradientLayer
        let gradientLayer = CAGradientLayer()
        gradientLayer.frame = frame

        // add colors as CGCologRef to a new array and calculate the distances
        var colorsRef = [CGColor]()
        var locations = [NSNumber]()

        for i in 0 ... colors.count-1 {
            colorsRef.append(colors[i].CGColor as CGColorRef)
            locations.append(Float(i)/Float(colors.count-1))
        }

        gradientLayer.colors = colorsRef
        gradientLayer.locations = locations

        // now build a UIImage from the gradient
        UIGraphicsBeginImageContext(gradientLayer.bounds.size)
        gradientLayer.renderInContext(UIGraphicsGetCurrentContext()!)
        let gradientImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        // return the gradient image
        return gradientImage
    }
}

Call it like this:

像这样调用它:

let colors = [
    UIColor.blueColor(),
    UIColor.greenColor()
    // and many more if you wish
]
let gradientImage = UIImage.convertGradientToImage(colors, frame: navigationBar.bounds)

and apply with:

并申请:

.backgroundColor = UIColor(patternImage: gradientImage)

or

或者

.setBackgroundImage(gradientImage, forBarMetrics: .Default)

回答by VNAIK

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = self.view.bounds;


gradient.startPoint = CGPointMake(1.0, 1.0); //Dark From bottom
gradient.endPoint = CGPointMake(1.0, 0);


gradient.colors = [NSArray arrayWithObjects:
                   (id)[[UIColor blackColor] CGColor],
                   (id)[[UIColor clearColor] CGColor], nil];


[self.view.layer insertSublayer:gradient atIndex:0];

回答by Devendra Singh

This is the best approach, working for me as requirement

这是最好的方法,按要求为我工作

CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = yourImageView.layer.bounds;

gradientLayer.colors = [NSArray arrayWithObjects:
                        (id)[UIColor colorWithWhite:1.0f alpha:1.0f].CGColor,
                        (id)[UIColor colorWithWhite:0.0f alpha:0.9f].CGColor,
                        nil];

gradientLayer.locations = [NSArray arrayWithObjects:
                           [NSNumber numberWithFloat:0.0f],
                           [NSNumber numberWithFloat:1.0f],
                           nil];

[yourImageView.layer addSublayer:gradientLayer];

回答by Lakshmi

-(void) drawGradientinBounds: (CGRect) currentBounds withColors:(NSArray*) colors andPercentages:(NSArray *)percentages andGradientDirectionIsVertical:(BOOL)isGradientDirectionVertical
{

    CGContextRef currentContext = UIGraphicsGetCurrentContext();

    CGGradientRef glossGradient;
    CGColorSpaceRef rgbColorspace;

    size_t num_locations = [percentages count];
    CGFloat locations[num_locations];
    for(int i=0;i<num_locations;i++)
        locations[i] = [[percentages objectAtIndex:i] floatValue];

    int comps = [colors count]*4;
    CGFloat components[comps];
    for(int i = [colors count]-1;i>=0;i--)
    {
        comps--;
        UIColor *c = [colors objectAtIndex:i];
        const CGFloat *cg = CGColorGetComponents([c CGColor]);
        components[comps] = cg[3];
        comps--;
        components[comps] = cg[2];
        comps--;
        components[comps] = cg[1];
        comps--;
        components[comps] = cg[0];
    }

    rgbColorspace = CGColorSpaceCreateDeviceRGB();
    glossGradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations);

    CGPoint topCenter;
    CGPoint endCenter;

    if(isGradientDirectionVertical)
    {
        topCenter = CGPointMake(CGRectGetMidX(currentBounds), currentBounds.origin.y);
        endCenter = CGPointMake(CGRectGetMidX(currentBounds), CGRectGetHeight(currentBounds)+currentBounds.origin.y);

    }
    else
    {
        topCenter = CGPointMake( currentBounds.origin.x,CGRectGetMidY(currentBounds));
        endCenter = CGPointMake(CGRectGetWidth(currentBounds)+currentBounds.origin.x,CGRectGetMidY(currentBounds));
    }
    CGContextDrawLinearGradient(currentContext, glossGradient, topCenter, endCenter, 0);

    CGGradientRelease(glossGradient);
    CGColorSpaceRelease(rgbColorspace);
}

And the input to this method are bounds, colorArray:

这个方法的输入是边界,colorArray:

[NSArray arrayWithObjects:[UIColor blackColor], [UIColor whiteColor], nil]

percentageArray:

百分比数组:

[NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0], [NSNumber numberWithFloat:1.0], nil]