Невидимый NSView попросили нарисовать - PullRequest
0 голосов
/ 05 марта 2019

Нормально ли при добавлении подпредставления, которое не видно в окне, вызывается метод 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()
    }
}

Заранее спасибо.

...