Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 错误的颜色&;带UIBezierPath的线宽_Ios_Swift3_Uibezierpath - Fatal编程技术网

Ios 错误的颜色&;带UIBezierPath的线宽

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,

我在UIBezierPath上遇到了一个奇怪的问题,我的颜色和线宽没有正确渲染

我画了一系列的线(像一把尺子),有大的和小的刻度。主要的渐变是长度较长的线条

主色调:红色,线宽:2.0 次要渐变:黄色,线宽:0.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方法听起来很有趣。我必须尝试一下。非常感谢。重新绘制,因为我们正在保存和恢复上下文,路径将重置为其先前的无路径状态(例如,保存上下文、添加路径、绘制路径,并将其还原为无路径状态,然后重复).Re
path.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()
}