CGContext Рисование двух соседних ромбоидов дает очень тонкий зазор, как его уменьшить? - PullRequest
0 голосов
/ 25 сентября 2019

Два соседних прямоугольника в порядке, как показано на рисунке ниже.

override func draw(_ rect: CGRect) {
    // Drawing code
    let leftTop = CGPoint(x:50,y:50)
    let rightTop = CGPoint(x:150,y:100)

    let leftMiddle = CGPoint(x:50,y:300)
    let rightMiddle = CGPoint(x:150,y:300)

    let leftDown = CGPoint(x:50,y:600)
    let rightDown = CGPoint(x:150,y:650)

    let context = UIGraphicsGetCurrentContext()
    context?.addLines(between: [leftTop,rightTop,rightMiddle,leftMiddle])
    UIColor.black.setFill()
    context?.fillPath()

    context?.addLines(between: [leftMiddle,rightMiddle,rightDown,leftDown])
    context?.fillPath()


    let leftTop1 = CGPoint(x:200,y:50)
    let rightTop1 = CGPoint(x:300,y:100)

    let leftMiddle1 = CGPoint(x:200,y:300)
    let rightMiddle1 = CGPoint(x:300,y:350)

    let leftDown1 = CGPoint(x:200,y:600)
    let rightDown1 = CGPoint(x:300,y:650)

    context?.addLines(between: [leftTop1,rightTop1,rightMiddle1,leftMiddle1])
    UIColor.black.setFill()
    context?.fillPath()

    context?.addLines(between: [leftMiddle1,rightMiddle1,rightDown1,leftDown1])
    context?.fillPath()
}

Вам может понадобиться увеличить изображение, чтобы увидеть зазор.Если я нарисую тонкую линию, чтобы закрыть пробел, любая ширина может перекрываться, если у цвета есть альфа-канал.

enter image description here

Измените shapeColor на let shapeColor = UIColor(white: 0.0, alpha: 0.5) и добавьте context?.setShouldAntialias(false) let shapeColor = UIColor(white: 0.0, alpha: 0.5)

1 Ответ

1 голос
/ 25 сентября 2019

У меня тот же результат при использовании CGContext, даже если я использую setShouldAntialias(true) или если я пытаюсь вызвать strokePath () в контексте.Но он отлично работает с sublayers, CGPath и strokeColor

class RhombView: UIView {
    let shapeColor: UIColor = .black

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.setupView()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.setupView()
    }

    func setupView() {
        let leftTop1 = CGPoint(x:200.0,y:50.0)
        let rightTop1 = CGPoint(x:300.0,y:100.0)

        let leftMiddle1 = CGPoint(x:200.0,y:300.0)
        let rightMiddle1 = CGPoint(x:300.0,y:350.0)

        let leftDown1 = CGPoint(x:200.0,y:600.0)
        let rightDown1 = CGPoint(x:300.0,y:650.0)

        var path = UIBezierPath()

        path.move(to: leftTop1)
        path.addLine(to: rightTop1)
        path.addLine(to: rightMiddle1)
        path.addLine(to: leftMiddle1)
        path.close()

        let subLayer1 = CAShapeLayer()
        subLayer1.path = path.cgPath
        subLayer1.frame = self.layer.frame
        subLayer1.fillColor = shapeColor.cgColor
        subLayer1.strokeColor = shapeColor.cgColor
        self.layer.addSublayer(subLayer1)

        path = UIBezierPath()

        path.move(to: leftMiddle1)
        path.addLine(to: rightMiddle1)
        path.addLine(to: rightDown1)
        path.addLine(to: leftDown1)
        path.close()

        let subLayer2 = CAShapeLayer()
        subLayer2.path = path.cgPath
        subLayer2.frame = self.layer.frame
        subLayer2.fillColor = shapeColor.cgColor
        subLayer2.strokeColor = shapeColor.cgColor
        self.layer.addSublayer(subLayer2)

        self.layer.backgroundColor = UIColor.white.cgColor
    }
}

Если вы удалите оба subLayer.strokeColor, вы увидите разрыв.

...