本文介绍了iOS-绘制渐变-Swift的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试为UILabel绘制一个渐变,但是它只会绘制我看不到的文字的颜色。
我从这里看到了代码
我正在尝试为UILabel绘制一个渐变,但是它只会绘制我看不到的文字的颜色。
我从这里看到了代码
有一种更简单的方法来获取渐变作为 UIImage
。您可以使用 CAGradientLayer
。例如:
func yellowGradientImage(bounds:CGRect)-> UIImage
{
let gradientLayer = CAGradientLayer()
gradientLayer.colors = [UIColor(红色:(202 / 255.0),绿色:(197 / 255.0),蓝色:(52 / 255.0) ,alpha:1.0).CGColor,UIColor(红色:(253 / 255.0),绿色:(248 / 255.0),蓝色:(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()
返回图像
}
将渐变应用于文本接下来,您需要使用 UIColor(patternImage:...)
使用返回为 textColor
的图像。例如:
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)
其结果是:
swift 3.0:
func yellowGradientImage(bounds:CGRect)-> UIImage
{
let gradientLayer = CAGradientLayer()
gradientLayer.colors = [UIColor(红色:(202 / 255.0),绿色:(197 / 255.0),蓝色:(52 / 255.0) ,alpha:1.0).cgColor,UIColor(红色:(253 / 255.0),绿色:(248 / 255.0),蓝色:(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()
返回图像!
}
让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)
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:
extension String{
func gradient(x:CGFloat,y:CGFloat, fontSize:CGFloat)->UIImage{
let font:UIFont = UIFont.systemFontOfSize(fontSize)
let name:String = NSFontAttributeName
let textSize: CGSize = self.sizeWithAttributes([name:font])
let width:CGFloat = textSize.width // max 1024 due to Core Graphics limitations
let height:CGFloat = textSize.height // max 1024 due to Core Graphics limitations
UIGraphicsBeginImageContext(CGSizeMake(width, height))
let context = UIGraphicsGetCurrentContext()
UIGraphicsPushContext(context!)
//draw gradient
let glossGradient:CGGradientRef?
let rgbColorspace:CGColorSpaceRef?
let num_locations:size_t = 2
let locations:[CGFloat] = [ 0.0, 1.0 ]
let components:[CGFloat] = [(202 / 255.0), (197 / 255.0), (52 / 255.0), 1.0, // Start color
(253 / 255.0), (248 / 255.0), (101 / 255.0), 1.0] // End color
rgbColorspace = CGColorSpaceCreateDeviceRGB()
glossGradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations)
let topCenter = CGPointMake(0, 0);
let bottomCenter = CGPointMake(0, textSize.height);
CGContextDrawLinearGradient(context, glossGradient, topCenter, bottomCenter, CGGradientDrawingOptions.DrawsBeforeStartLocation)
UIGraphicsPopContext()
let gradientImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return gradientImage
}
}
and the setup of the imageView
self.timeLeftIV = UIImageView(frame: CGRectMake(self.pyramidFakeView.frame.origin.x/2-25,0, 100,20))
self.timeLeftIV.image = "59:48".gradient(timeLeftIV.frame.origin.x, y: timeLeftIV.frame.origin.y, fontSize: 6.0)
the result of the code:
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)
这篇关于iOS-绘制渐变-Swift的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!