当您添加在窗口中不可见的子视图时,调用了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()
}
}
谢谢。