0

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

1pt 实线不透明

这是代码(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)
}

谢谢。

4

2 回答 2

2

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

如果直线尺寸不规则,则需要将它们定位在正负 0.5 点以防止抗锯齿

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

现在这条线很脆

在此处输入图像描述

于 2018-10-12T20:01:07.333 回答
1

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

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

因此,macOS——作为抗锯齿的一部分——将细线和背景混合在一起,即在将像素绘制到背景上之前使像素部分透明。效果是线条被感知为更细,即使它仍然是 1 像素宽。

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

顺便说一句:像素大小取决于分辨率。在视网膜设备上,1 像素是 0.5 点,在非视网膜设备上是 1 点,甚至还有中间因素。

于 2018-10-12T06:26:02.743 回答