要求绘制不可见的NSView

时间:2019-03-04 22:09:05

标签: swift macos draw nsview

当您添加在窗口中不可见的子视图时,调用了draw(_ :)方法是否正常? 因此,子视图的框架位于窗口.contentView的.visibleRect之外。

我认为绘图是“根据需要”完成的,对我来说似乎不需要隐形。

奇怪的是,当子视图的宽度或高度大于256时,则不会调用draw(_ :)方法。

我确实发现“响应滚动”机制可以导致对不可见视图的更多draw(_ :)调用。但是,通过响应滚动,将使用NSView.prepareContent(in :)方法。
该方法的文档说:

“在响应式滚动过程中,AppKit在要求您的视图在覆盖区域中绘制任何内容之前调用此方法。”

在我的情况下,此prepareContent(in :)方法未调用,因此响应滚动似乎不是原因。

其他一些文档说:

”“视图第一次出现在窗口中时,矩形与视图的边界匹配,并且该视图绘制其所有内容。随后,该视图仅在必要时绘制自身,并且仅绘制其自身的该部分发生了变化。”

在我的情况下,对draw(_ :)方法的调用传递了整个内容的dirtyRect。

所以对draw(_ :)的调用看起来像是普通的首次调用,但是256和看不见使我不清楚。

希望听到您的想法。

这是我的快速示例代码:

class FirstView: NSView {

    override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
    }

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

        // Add the invisible subview.
        // A width or height of 257 will not be drawed.
        let subview = SecondView(frame: NSRect(x: 12345, y: 0, width: 256, height: 256))
        self.addSubview(subview)
    }

    override func prepareContent(in rect: NSRect) {

        print("FirstView.prepareContent()")

        super.prepareContent(in: rect)
    }

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

        print("FirstView.draw() \(dirtyRect)")

        // White background.
        let path = NSBezierPath(rect: self.bounds)
        NSColor.white.setFill()
        path.fill()
    }
}

class SecondView: NSView {

    override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
    }

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

    override func prepareContent(in rect: NSRect) {

        print("SecondView.prepareContent()")

        super.prepareContent(in: rect)
    }

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

        print("SecondView.draw() \(dirtyRect)")

        // Blue background.
        let path = NSBezierPath(rect: self.bounds)
        NSColor.blue.setFill()
        path.fill()
    }
}

谢谢。

0 个答案:

没有答案