根据iOS CAGradientLayer文档,type属性只有一个有效值kCAGradientLayerAxial,它也恰好是默认值.这个属性的目的对我来说是一个谜,因为我想要实现径向CAGradientLayer而不覆盖drawLayer:inContext,并且希望找到类似于kCAGradientLayerRadial的东西.任何照明都赞赏.
嗨,我正在尝试在swift中编写颜色选择器,看起来像这样.
但到目前为止,我成功了.
画圆很容易,继承人代码......
fileprivate func setupScene(){
let circlePath: UIBezierPath = UIBezierPath(arcCenter: CGPoint(x: self.wheelView.frame.width/2, y: self.wheelView.frame.height/2), radius: CGFloat(self.wheelView.frame.height/2), startAngle: CGFloat(0), endAngle:CGFloat(Double.pi * 2), clockwise: true)
let shapeLayer = CAShapeLayer()
shapeLayer.path = circlePath.cgPath
//color inside circle
shapeLayer.fillColor = UIColor.clear.cgColor
//colored border of circle
shapeLayer.strokeColor = UIColor.purple.cgColor
//width size of border
shapeLayer.lineWidth = 10
wheelView.layer.addSublayer(shapeLayer)
}
@IBOutlet var wheelView: UIView!
Run Code Online (Sandbox Code Playgroud)
但是现在我不知道如何插入彩虹色......我尝试了CAGradientLayer,但它不可见.有什么好建议吗?
一个普通的UIView子类,只有以下代码:
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
// Initialization code
CAGradientLayer* gradientLayer = [CAGradientLayer layer];
gradientLayer.colors = [NSArray arrayWithObjects:[UIColor whiteColor], [UIColor blackColor], nil];
gradientLayer.locations = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0], [NSNumber numberWithFloat:1.0], nil];
[self.layer addSublayer:gradientLayer];
return self;
}
Run Code Online (Sandbox Code Playgroud)
使用EXC_BAD_ACCESS杀死运行时(不,在你问之前没有僵尸).
此外,它不是CAGradientLayer过度释放 - 在图层上放置多个浮动保留没有效果.
(顺便说一下,我从来没有见过CAGradientLayer实际工作,在我参与的任何项目上.我认为它被诅咒:).我不会使用它,除了我需要动画渐变,Apple的CGGradient类只支持const数组,这使动画代码容易出错)
我使用以下代码将渐变颜色设置为标签的背景,但没有影响我做错了什么?代码在这里:
[self.teamName setTextColor:[UIColor whiteColor]];
[self.teamName setBackgroundColor:[UIColor clearColor]];
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = self.teamName.bounds;
gradientLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor whiteColor]CGColor], (id)[[UIColor blackColor]CGColor], nil];
[self.teamName.layer insertSublayer:gradientLayer atIndex:0];
Run Code Online (Sandbox Code Playgroud) 我使用以下代码来设置渐变颜色:
NSArray *locations = @[@0.0, @0.1f];
CAGradientLayer *headerLayer = [CAGradientLayer layer];
headerLayer.colors = colors;
headerLayer.locations = locations;
Run Code Online (Sandbox Code Playgroud)
如何制作径向渐变颜色?
我想我必须改变位置,但我没有猜到正确的位置。另外,我试过这个:
headerLayer.anchorPoint = CGPointMake(0.5, 1.0);
Run Code Online (Sandbox Code Playgroud)
但它不起作用。
谢谢。
我有一张桌子,它运作良好。但是我必须在背景上添加渐变。我用viewDidLoad中的这段代码做到了:
gradientLayer.frame = self.view.bounds
let color1 = UIColor.blueColor().CGColor as CGColorRef
let color2 = UIColor.redColor().CGColor as CGColorRef
gradientLayer.colors = [color1, color2]
gradientLayer.locations = [0.0, 1.0]
gradientLayer.startPoint = CGPoint(x: 1, y: 0)
gradientLayer.endPoint = CGPoint(x: 0, y: 0)
self.view.layer.addSublayer(gradientLayer)
self.view.backgroundColor = UIColor.greenColor()
Run Code Online (Sandbox Code Playgroud)
但是现在我看不到表视图的任何内容。
有人可以帮帮我吗?
我尝试在我使用Core Graphics制作的饼图中添加CAGradient效果.事实证明,我无法理解如何将它应用于作为CGPath一部分的视图......
override func draw(_ rect: CGRect)
{
...
func arc(myRadius: CGFloat, myStartAngle: CGFloat, myEndAngle: CGFloat) {
// This is the pie chart segment
context?.setFillColor(phenotypeColor.cgColor)
context?.move(to: center)
context?.addArc(center: center, radius: finalRadius, startAngle: myStartAngle, endAngle: myEndAngle, clockwise: true)
context?.fillPath()
(...)
let gradientLayer = CAGradientLayer()
gradientLayer.frame = self.bounds
gradientLayer.colors = [UIColor.red, UIColor.blue]
self.layer.addSublayer(gradientLayer)
}
Run Code Online (Sandbox Code Playgroud)
我在屏幕上看不到任何渐变(只有白色背景......).最后,clip在保存状态后我也尝试了上下文juste,但我不确定是否剪切了任何东西,因为我没有看到任何渐变(无论是在整个视图上还是仅在片段上).我阅读了文档,但它没有清楚(在我的情况下......).
这是我第一次问一个问题,请原谅我不是很彻底。
基本上,我试图在绘制为图形的UIBezierPath之上应用渐变层。
这是我的图:

这是我要使用的渐变层:

这是我尝试绘制的图形:
let path = quadCurvedPathWithPoints(points: points)
let shapeLayer = CAShapeLayer()
shapeLayer.path = path.cgPath
shapeLayer.strokeColor = UIColor.blue.cgColor
shapeLayer.fillColor = UIColor.white.cgColor
shapeLayer.position = CGPoint(x: 0, y: 0)
shapeLayer.lineWidth = 1.0
Run Code Online (Sandbox Code Playgroud)
显然,这会用蓝色笔触填充图形,但是现在我尝试将白色渐变为绿色。我这样做的方式不起作用。结果如下:

这是我正在努力的代码:
let startColor = UIColor.white.withAlphaComponent(0.5)
let endColor = UIColor.green
let gradient = CAGradientLayer()
gradient.colors = [startColor.cgColor, endColor.cgColor]
gradient.startPoint = CGPoint(x: 0.0, y: 0.5)
gradient.endPoint = CGPoint(x: 1.0, y: 0.5)
gradient.frame = path.bounds
let shapeMask = CAShapeLayer()
shapeMask.path = path.cgPath
gradient.mask = shapeLayer
sparkLineView.layer.addSublayer(gradient)
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个可以在整个应用程序中使用的自定义 UIButton。我想应用渐变作为其背景,但是使用这个非常简单的代码没有显示渐变。如果有人能在下面的代码中指出我的错误,那将非常有帮助。
class GradientBtn: UIButton {
let gradientLayer = CAGradientLayer()
override init(frame: CGRect) {
super.init(frame: frame)
themeConfig()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
themeConfig()
}
private func themeConfig() {
//shadow
layer.shadowOffset = CGSize.zero
layer.shadowColor = UIColor.gray.cgColor
layer.shadowOpacity = 1.0
//titletext
setTitleColor(Theme.colorWhite, for: .normal)
titleLabel?.font = UIFont(name: Theme.fontAvenir, size: 18)
//rounded corners
layer.cornerRadius = frame.size.height / 2
//gradient
gradientLayer.locations = [0.0, 1.0]
gradientLayer.colors = [Theme.colorlightBlue, Theme.colorMidBlue]
gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.0)
gradientLayer.endPoint = CGPoint(x: 1.0, y: 1.0)
gradientLayer.frame …Run Code Online (Sandbox Code Playgroud) 我正在尝试快速创建径向 CAGradientLayer。正常的 CAGradientLayers(默认类型axial)没有问题。它们在快照和模拟器的运行时渲染得很好。
当我拍摄我创建的 UIView 的快照(仅用于 CAGradientLayer)时,它显示了一个漂亮的径向 CAGradientLayer。然而,当我使用这个视图并在模拟器中运行时查看它时,它看起来很糟糕。我不知道我做错了什么。
这是 CAGradientLayer 的代码:
import Foundation
class ChannelGradientView: UIView {
// MARK: - Init
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
// MARK: - Setup
private func setup() {
backgroundColor = .clear
setupGradient()
}
private func setupGradient() {
let gradient = layer as? CAGradientLayer
gradient?.type = .radial
gradient?.colors = [
UIColor.black.withAlphaComponent(0.8),
UIColor.black.withAlphaComponent(0)
].map { $0.cgColor }
let blackPoint = CGPoint(x: 1, …Run Code Online (Sandbox Code Playgroud) cagradientlayer ×10
ios ×6
swift ×6
objective-c ×2
uiview ×2
calayer ×1
cgcontext ×1
cocoa ×1
gradient ×1
swift4 ×1
uibezierpath ×1
uibutton ×1
uilabel ×1
uitableview ×1