Swift CAShapeLayer становится частично прозрачным на 1pt или ниже - PullRequest
0 голосов
/ 12 октября 2018

Я пытался получить сплошной цвет, когда рисую линию шириной 0,5 пт, но он становится непрозрачным, когда значение равно 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 голосов
/ 12 октября 2018

Я нашел ответ в https://www.raywenderlich.com/411-core-graphics-tutorial-part-1-getting-started (Все потому, что сглаживание, как объяснено в первом ответе Кодо)

Если у вас прямые линии странного размера, вынужно расположить их в плюс или минус 0,5 точки, чтобы предотвратить сглаживание

Итак, если lineWidth составляет 1pt или меньше, я добавляю 0,5 точки или (1 / шкала).Теперь линия хрустящая

enter image description here

0 голосов
/ 12 октября 2018

Я думаю, когда вы говорите непрозрачный , вы имеете в виду частично прозрачный.И я думаю, что мы говорим здесь о macOS, верно?

Как вы ожидаете, что на экране будет выглядеть линия размером менее 1 пикселя?Пиксель - это самая маленькая единица экрана.Весь пиксель имеет одинаковый цвет.Он не может быть частично красным и частично белым.

Таким образом, macOS - как часть сглаживания - смешивает тонкую линию и фон, то есть делает пиксели частично прозрачными перед их рисованиемна заднем плане.Эффект состоит в том, что линия воспринимается как более тонкая, даже если она все еще имеет ширину 1 пиксель.

Если вам не нравится этот эффект, не рисуйте линии размером менее 1 пикселя.Но только так линия выглядит тоньше, чем 1 пиксель.

Кстати: размер пикселя зависит от разрешения.На устройстве с сетчаткой глаза 1 пиксель равен 0,5 балла, на устройствах без сетчатки - 1 балл, и между ними есть даже факторы.

...