Мигающий курсор в NSTextField вызывает вызов drawRect: в пользовательском NSView

Я столкнулся с самой странной проблемой:

У меня есть приложение Cocoa с пользовательским NSView внутри NSScrollView.

Когда я нажимаю на текстовое поле, drawRect: вызывается в моем пользовательском представлении каждый раз, когда курсор мигает.

Если я перенесу свое пользовательское представление за пределы представления прокрутки, проблема исчезнет. Также, если я размещу свое тестовое представление в самом низу его родительского представления, проблема исчезнет.

Это не дубликат Почему мигающий курсор в текстовом поле вызывает вызов drawRect?, это та же проблема, но я не переопределял hitTest:. На самом деле моя реализация тестового представления выглядит так:

class TestView:NSView
{
    override func draw(_ dirtyRect: NSRect) {
        NSColor.red.set()
        dirtyRect.fill()

        logWarning("drawRect in custom view called. dirty rect: \(NSStringFromRect(dirtyRect))")
    }
}

Моя иерархия представлений:

NSWindow
  NSSplitView
    NSView
      NSVisualEffectView
        NSTabView
          NSView
            NSScrollView
              NSView
                TestView

Кажется, это комбинация NSVisualEffectView и NSScrollView. Я не могу воспроизвести это в новом проекте. Я попытался перетасовать представления в своем существующем приложении, но не могу это определить.

Проблема в действии:

Проблема

Обратите внимание, как drawRect: вызывается, как только текстовое поле получает фокус и останавливается, когда я щелкаю снаружи. Я не понимаю, почему несвязанный вид должен перерисовываться с каждым импульсом курсора.


person Mark    schedule 08.03.2018    source источник
comment
Где в иерархии представлений находится текстовое поле? В чем вопрос?   -  person Willeke    schedule 08.03.2018
comment
Я экспериментировал с различными вариантами размещения текстового поля, неважно, где я его размещаю, чтобы вызвать проблему. Проблема в том, что drawRect: вызывается каждый раз, когда рисуется курсор ввода (он мигает и выключается).   -  person Mark    schedule 08.03.2018
comment
Ответ на связанный вопрос использует переопределение hitTest: для регистрации, он ничего не делает. Таким образом, похоже, что ответ на hitTest определяет, какие представления будут перерисованы. Почему вызов drawRect: является проблемой?   -  person Willeke    schedule 09.03.2018
comment
Я добавил GIF, показывающий проблему. Я не понимаю, почему несвязанный вид перерисовывается, когда курсор мигает. Может быть, побочный эффект просмотра визуальных эффектов или просмотра прокрутки?   -  person Mark    schedule 09.03.2018
comment
Согласно связанному вопросу, это причуда мигающего курсора.   -  person Willeke    schedule 09.03.2018