iOS - Draw gradient - Swift

前端 未结 2 1337
执念已碎
执念已碎 2020-12-10 08:24

I\'m trying to draw a gradient to UILabel, but it draws only the colors I can\'t see the text. I saw the code from here StackOverflow

my modification:



        
相关标签:
2条回答
  • 2020-12-10 09:17

    There is an easier way of getting a gradient as a UIImage. You can use a CAGradientLayer. For example:

    func yellowGradientImage(bounds:CGRect) -> UIImage
    {
        let gradientLayer = CAGradientLayer()
        gradientLayer.colors = [UIColor(red: (202 / 255.0), green: (197 / 255.0), blue: (52 / 255.0), alpha: 1.0).CGColor, UIColor(red: (253 / 255.0), green: (248 / 255.0), blue: (101 / 255.0), alpha: 1.0).CGColor]
        gradientLayer.bounds = bounds
        UIGraphicsBeginImageContextWithOptions(gradientLayer.bounds.size, true, 0.0)
        let context = UIGraphicsGetCurrentContext()
        gradientLayer.renderInContext(context!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
    

    To apply the gradient to text you next need to use the image returned as the textColor using UIColor(patternImage: ...). For example:

    let label = UILabel()
    label.font = UIFont.systemFontOfSize(150.0)
    label.text = "HELLO WORLD"
    label.sizeToFit()
    
    let image = yellowGradientImage(label.bounds)
    label.textColor = UIColor(patternImage: image)
    

    Which results in:

    swift 3.0:

    func yellowGradientImage(bounds:CGRect) -> UIImage
    {
        let gradientLayer = CAGradientLayer()
        gradientLayer.colors = [UIColor(red: (202 / 255.0), green: (197 / 255.0), blue: (52 / 255.0), alpha: 1.0).cgColor, UIColor(red: (253 / 255.0), green: (248 / 255.0), blue: (101 / 255.0), alpha: 1.0).cgColor]
        gradientLayer.bounds = bounds
        UIGraphicsBeginImageContextWithOptions(gradientLayer.bounds.size, true, 0.0)
        let context = UIGraphicsGetCurrentContext()
        gradientLayer.render(in: context!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image!
    }
    
    let label = UILabel()
    label.font = UIFont.systemFont(ofSize: 150.0)
    label.text = "HELLO WORLD"
    label.sizeToFit()
    
    let image = yellowGradientImage(bounds: label.bounds)
    label.textColor = UIColor(patternImage: image)
    
    0 讨论(0)
  • 2020-12-10 09:22

    add a view, modify draw rect with below code.

    override func drawRect(rect: CGRect) {
            // Drawing code
    
            let currentContext = UIGraphicsGetCurrentContext()
    
            CGContextSaveGState(currentContext);
            let colorSpace = CGColorSpaceCreateDeviceRGB()
    
            let startColor = UIColor(red: 0.1, green: 0.0, blue: 0.0, alpha: 0.0)
            let startColorComponents = CGColorGetComponents(startColor.CGColor)
            let middleColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.2)
            let middleColorComponents = CGColorGetComponents(middleColor.CGColor)
            let lowerMiddleColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.3)
            let lowerMiddleColorComponents = CGColorGetComponents(lowerMiddleColor.CGColor)
            let endColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.5)
            let endColorComponents = CGColorGetComponents(endColor.CGColor)
    
            var colorComponents = [startColorComponents[0], startColorComponents[1], startColorComponents[2], startColorComponents[3], middleColorComponents[0], middleColorComponents[1], middleColorComponents[2], middleColorComponents[3], lowerMiddleColorComponents[0], lowerMiddleColorComponents[1], lowerMiddleColorComponents[2], lowerMiddleColorComponents[3], endColorComponents[0], endColorComponents[1], endColorComponents[2], endColorComponents[3]]
            var locations:[CGFloat] = [0.0, 0.6, 0.8, 1.0]
            let gradient = CGGradientCreateWithColorComponents(colorSpace,&colorComponents,&locations,4)
            let startPoint = CGPointMake(0, 0)
            let endPoint = CGPointMake(0, self.bounds.height)
            CGContextAddRect(currentContext, CGRect(x: 0, y: 0, width: self.bounds.width, height: self.bounds.height));
            CGContextClip(currentContext);
            CGContextDrawLinearGradient(currentContext,gradient,startPoint,endPoint, CGGradientDrawingOptions.DrawsBeforeStartLocation)
            CGContextRestoreGState(currentContext)
        }
    

    Now in storyboard add a view change class to your gradient class and add a label to this view.

    See if it works for you.

    0 讨论(0)
提交回复
热议问题