Drawing gradient over image in ios

后端 未结 5 638
天涯浪人
天涯浪人 2020-12-08 11:55

How to create gradient colour look like following image programatically.

\"enter

相关标签:
5条回答
  • 2020-12-08 12:34
    -(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:

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

    percentageArray:

    [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0], [NSNumber numberWithFloat:1.0], nil] 
    
    0 讨论(0)
  • 2020-12-08 12:41
    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];
    
    0 讨论(0)
  • 2020-12-08 12:52

    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];
    
    0 讨论(0)
  • 2020-12-08 12:59

    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 *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:

    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:

    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 view and then add the gradient layer to it:

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

    See the CAGradientLayer class reference.

    0 讨论(0)
  • 2020-12-08 13:00

    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.

    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)
    
    0 讨论(0)
提交回复
热议问题