перерисовка границы NSView во время изменения размера окна имеет задержку - PullRequest
1 голос
/ 09 апреля 2020

Я сделал простой заголовок ViewView, который показывает aws серую нижнюю линию над основным NSView, как заголовок в Xcode. Код показан ниже:

import Cocoa

class HeaderView: NSView {
    var border = CALayer()

    required init?(coder decoder: NSCoder) {
        super.init(coder: decoder)

        self.wantsLayer = true

        self.layer?.backgroundColor = NSColor.white.cgColor
        border.backgroundColor = NSColor.quaternaryLabelColor.cgColor

        layer?.addSublayer(border)
    }

    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)

        border.frame = CGRect(x: 0.0, y: 0.0, width: frame.width, height: CGFloat(1.0))
    }
}

Строка dr aws, но когда я изменяю размер окна, возникает небольшая задержка, когда линия перерисовывается. Так что, если я потяну правую сторону окна вправо, вы можете кратко увидеть разрыв в строке на правой стороне.

Я также попытался добавить:

self.layerContentsRedrawPolicy = .duringViewResize

Но это ничего не изменилось.

Как я могу убедиться, что строка постоянно обновляется при изменении размера окна?

1 Ответ

0 голосов
/ 10 апреля 2020

Я исправил это с помощью NSBezierPath:

override func draw(_ dirtyRect: NSRect) {
    super.draw(dirtyRect)

    let path = NSBezierPath()
    path.move(to: NSPoint(x: 0.0, y: 0.0))
    path.line(to: NSPoint(x: frame.width, y: 0.0))
    NSColor.quaternaryLabelColor.setStroke()
    path.stroke()
}
...