Ios 错误的颜色&;带UIBezierPath的线宽
我在UIBezierPath上遇到了一个奇怪的问题,我的颜色和线宽没有正确渲染 我画了一系列的线(像一把尺子),有大的和小的刻度。主要的渐变是长度较长的线条 主色调:红色,线宽:2.0 次要渐变:黄色,线宽:0.0(最细线条根据规范)Ios 错误的颜色&;带UIBezierPath的线宽,ios,swift3,uibezierpath,Ios,Swift3,Uibezierpath,我在UIBezierPath上遇到了一个奇怪的问题,我的颜色和线宽没有正确渲染 我画了一系列的线(像一把尺子),有大的和小的刻度。主要的渐变是长度较长的线条 主色调:红色,线宽:2.0 次要渐变:黄色,线宽:0.0(最细线条根据规范) override func draw(在ctx:CGContext中){ 如果let=cameraControlSlider{ guard gradationValues.count>=0其他{ 返回 } 设frame=CGRect(x:insetBy,y:0,
override func draw(在ctx:CGContext中){
如果let=cameraControlSlider{
guard gradationValues.count>=0其他{
返回
}
设frame=CGRect(x:insetBy,y:0,width:bounds.width-insetBy,height:bounds.height)
ctx.清除(帧)
设startx=Int(frame.origin.x)
设endx=Int(frame.origin.x+frame.width)
让递增宽度=(endx-startx)/(屏幕上的梯度值+1)
变量计数器=1
var x=开始发送+计数器*递增宽度
而xCGPath{
let path=UIBezierPath()
ctx.setStrokeColor(color.cgColor)
path.lineWidth=CGFloat(线宽)
移动路径(到:CGPoint(x:x1,y:y1))
路径添加线(到:CGPoint(x:x2,y:y2))
path.close()
ctx.strokePath()
返回路径.cgPath
}
基本上,我希望较长的线条是红色,较粗的线条宽度,但颜色看起来是颠倒的,线条宽度似乎没有任何影响
从draw函数可以看出,没有与较小线长度相关的UIColor红色。我曾尝试在创建路径之前设置笔划颜色,但似乎不起作用 这里有几个问题,但关键问题是
drawLine
正在创建UIBezierPath
并调用strokePath
。但是,strokePath
并不是笔划您刚刚创建的UIBezierPath
,而是笔划添加到该上下文中的上一条路径。但是,由于直到从绘图行返回后才将该行添加到上下文中,因此所有内容都将按1关闭。另外,由于要将所有这些行添加到上下文中(而不是替换路径),因此要重复地重画相同的行
您可以通过调用drawLine
而不是addPath(drawLine(…)
)来修复它:
请注意,我正在保存和恢复图形上下文,以便每次都可以绘制新的线段路径。此外,由于我正在笔划上下文的路径,因此我在上下文而不是路径上调用setLineWidth
。此外,此处未显示,我发现如果我笔划宽度为零的黄线,它们不会出现,因此我使用了1:
注意,如果这是一个UIView
子类,您可以进一步简化它(只需直接划过UIBezierPath
,而不是与CoreGraphics混在一起,您可以使它成为@IBDesignable
,等等)
,我可能会这样做。这是完美的@Rob。这是有道理的。但是,您提到,自从我们添加到上下文后,它正在重新绘制。在保存G状态的同时,您上面提到的更改不会仍然发生这种情况。另外,您何时使用path.stroke vs ctx.stroke。path.stroke给了我在中的错误有效上下文这就是我没有使用它的原因。UIView方法听起来很有趣。我必须尝试一下。非常感谢。重新绘制,因为我们正在保存和恢复上下文,路径将重置为其先前的无路径状态(例如,保存上下文、添加路径、绘制路径,并将其还原为无路径状态,然后重复).Repath.stroke
,当您已经处于图形上下文中时(例如,在UIView
子类的draw(\rect:)
中)使用它。我非常喜欢UIView
子类方法,因为代码更简单,您可以像任何其他UIView
一样将其添加到视图层次结构中,如果合适的话,将其设置为@IBDesignable
,并在故事板中正确查看。但是您可能已经编写了足够的绘图(in:)
这是一种比所需工作量更多的模式。幸运的是,这两种方法都能很好地工作。
override func draw(in ctx: CGContext) {
...
while x < endx {
...
drawLine(in: ctx, x1: x, y1: y1, x2: x, y2: y2, color: color, lineWidth: lineWidth)
...
}
}
func drawLine(in ctx: CGContext, x1: Int, y1: Int, x2: Int, y2: Int, color: UIColor, lineWidth: Float) {
let path = UIBezierPath()
ctx.saveGState()
ctx.setStrokeColor(color.cgColor)
ctx.setLineWidth(CGFloat(lineWidth))
path.move(to: CGPoint(x: x1, y: y1))
path.addLine(to: CGPoint(x: x2, y: y2))
ctx.addPath(path.cgPath)
ctx.strokePath()
ctx.restoreGState()
}