Swift CAShapeLayer在1pt或更低时变得部分透明

时间:2018-10-12 04:10:56

标签: swift line cashapelayer

我一直在尝试绘制0.5pt宽度的线条时获得纯色,但是当值小于等于1.0时它变得不透明(参见图片)。

1pt solid line opaques

这是代码(Swift 4)

func DrawLine(from:CGPoint, to:CGPoint) {
    let path = UIBezierPath()
    path.move(to: from)
    path.addLine(to: to)
    let lineLayer = CAShapeLayer()
    lineLayer.path = path.cgPath
    lineLayer.lineWidth = linesWidth
    lineLayer.strokeColor = linesColor.cgColor
    lineLayer.isOpaque = false // trying to make it work line
    lineLayer.opacity = 1 // trying to make it work line
    lineLayer.shadowColor = UIColor.clear.cgColor // trying to make it work line
    lineLayer.shadowOffset = .zero // trying to make it work line
    lineLayer.shadowOpacity = 0 // trying to make it work line
    self.layer.insertSublayer(lineLayer, at: 0)
}

谢谢。

2 个答案:

答案 0 :(得分:2)

我在https://www.raywenderlich.com/411-core-graphics-tutorial-part-1-getting-started找到了答案(全部是因为Codo在第一个答案中解释了抗锯齿)

  

如果直线的尺寸奇怪,则需要将其定位   达到正负0.5点以防止抗锯齿

因此,如果lineWidth为1pt或更小,我将添加0.5点或(1 /比例)。

现在这条线很脆

enter image description here

答案 1 :(得分:1)

我认为当您说不透明时,您的意思是部分透明。而且我想我们在这里谈论的是macOS,对吧?

您如何看待少于1像素的线出现在屏幕上?像素是屏幕的最小单位。整个像素具有相同的颜色。它不能是部分红色和部分白色。

因此,作为 antialiasing 的一部分,macOS混合了细线和背景,即,它使像素在背景上绘制之前部分透明。效果是,即使它仍然是1像素宽,该行也会被视为较细。

如果您不喜欢这种效果,请不要绘制少于1个像素的线。但这是线条看起来比1像素细的唯一方法。

BTW:像素大小取决于分辨率。在视网膜设备上,1像素为0.5点,在非视网膜设备上,其为1点,并且两者之间甚至还有因素。