Я столкнулся с самой странной проблемой:
У меня есть приложение 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:
вызывается, как только текстовое поле получает фокус и останавливается, когда я щелкаю снаружи. Я не понимаю, почему несвязанный вид должен перерисовываться с каждым импульсом курсора.
hitTest:
для регистрации, он ничего не делает. Таким образом, похоже, что ответ на hitTest определяет, какие представления будут перерисованы. Почему вызовdrawRect:
является проблемой? - person Willeke   schedule 09.03.2018