Нормально ли при добавлении подпредставления, которое не видно в окне, вызывается метод draw (_ :)?Таким образом, рамка подпредставления лежит за пределами .visibleRect окна .contentView.
Я думал, что рисование было сделано "по мере необходимости", и невидимое мне не кажется необходимым.
Странно то, что когда ширина или высота подпредставления больше 256, метод draw (_ :) не вызывается.
Я обнаружил, что механизм "отзывчивой прокрутки"может вызвать больше вызовов draw (_ :) к невидимым представлениям.Однако при адаптивной прокрутке используется метод NSView.prepareContent (in :).
Документация по этому методу гласит:
"Во время прокручиваемой прокрутки AppKit вызывает этот метод, прежде чем запрашивать представлениеотрисовывать любой контент в области перерисовки. "
В моем случае этот метод prepareContent (in :) не вызывается, поэтому причина в прокручивании с прокруткой не возникает.
В некоторых других документах говорится:
"При первом отображении представления в окне прямоугольник соответствует границам представления, и представление отображает все его содержимое. Впоследствии представление отображает себя только тогда, когданеобходимо и рисует только ту часть себя, которая изменилась. "
В моем случае вызов метода draw (_ :) передается dirtyRect для всего содержимого.
Так что призыв к рисованию (_ :) выглядит как обычный первый вызов, но 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()
}
}
Заранее спасибо.