2015-01-06 4 views
3

Недавно я заметил, что некоторые элементы управления (NSTableView NSOutlineView) в моем приложении мерцают, когда я изменяю размер окна приложения.NSWindow redraw issues/мерцает при изменении размера

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

Здесь пока скриншот, показывающий фрагменты пользовательского интерфейса при изменении размеров окна:

Sample screenshot

Уведомление фрагмент представления набросков в верхней части, на белом фоне , и тень офсетного окна.

В консоли также есть предупреждение о базовой графике (см. Ниже). Не уверен, связано ли это с проблемой.

Приложение работает под управлением Mac OS X 10.10.1, целью развертывания и базовым SDK установлено значение 10.9.

Консоль вывода (не авария):

<Warning>: void CGSUpdateManager::log() const: conn 0x22833 token 0x10dfffffffff3823 
<Warning>: Backtrace (at 4250.73): 
<Warning>: void CGSUpdateManager::log() const: 0 CoreGraphics      0x00007fff986f5215 CGSBacktraceCreate + 59 
<Warning>: void CGSUpdateManager::log() const: 1 CoreGraphics      0x00007fff98714688 _ZN16CGSUpdateManager14disable_updateEv + 84 
<Warning>: void CGSUpdateManager::log() const: 2 AppKit        0x00007fff8e4e2de5 -[NSWindow disableScreenUpdatesUntilFlush] + 127 
<Warning>: void CGSUpdateManager::log() const: 3 AppKit        0x00007fff8e4a2250 -[NSView _gainedLayerTreeHostAncestor] + 385 
<Warning>: void CGSUpdateManager::log() const: 4 AppKit        0x00007fff8e4a20ae -[NSView _recursiveGainedLayerTreeHostAncestor] + 27 
<Warning>: void CGSUpdateManager::log() const: 5 AppKit        0x00007fff8e4a667a -[NSScroller _recursiveGainedLayerTreeHostAncestor] + 103 
<Warning>: void CGSUpdateManager::log() const: 6 AppKit        0x00007fff8e70da56 -[NSScroller _setSurfaceBacked:] + 213 
<Warning>: void CGSUpdateManager::log() const: 7 AppKit        0x00007fff8e67324f -[NSScrollView setScrollerStyle:] + 304 
<Warning>: void CGSUpdateManager::log() const: 8 AppKit        0x00007fff8ed0af27 +[NSScrollerImpPair _updateAllScrollerImpPairsForNewRecommendedScrollerStyle:] + 426 
<Warning>: void CGSUpdateManager::log() const: 9 CoreFoundation      0x00007fff8b36fcbc __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 12 
<Warning>: void CGSUpdateManager::log() const: 10 CoreFoundation      0x00007fff8b2611b4 _CFXNotificationPost + 3140 
<Warning>: void CGSUpdateManager::log() const: 11 Foundation       0x00007fff8b5f8ea1 -[NSNotificationCenter postNotificationName:object:userInfo:] + 66 
<Warning>: void CGSUpdateManager::log() const: 12 CoreFoundation      0x00007fff8b2d154c __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12 
<Warning>: void CGSUpdateManager::log() const: 13 CoreFoundation      0x00007fff8b2c3655 __CFRunLoopDoBlocks + 341 
<Warning>: void CGSUpdateManager::log() const: 14 CoreFoundation      0x00007fff8b2c2e0e __CFRunLoopRun + 910 
<Warning>: void CGSUpdateManager::log() const: 15 CoreFoundation      0x00007fff8b2c2838 CFRunLoopRunSpecific + 296 
<Warning>: void CGSUpdateManager::log() const: 16 HIToolbox       0x00007fff9980043f RunCurrentEventLoopInMode + 235 
<Warning>: void CGSUpdateManager::log() const: 17 HIToolbox       0x00007fff998000be ReceiveNextEventCommon + 179 
<Warning>: void CGSUpdateManager::log() const: 18 HIToolbox       0x00007fff997ffffb _BlockUntilNextEventMatchingListInModeWithFilter + 71 
<Warning>: void CGSUpdateManager::log() const: 19 AppKit        0x00007fff8e4266d1 _DPSNextEvent + 964 
<Warning>: void CGSUpdateManager::log() const: 20 AppKit        0x00007fff8e425e80 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 194 
<Warning>: void CGSUpdateManager::log() const: 21 AppKit        0x00007fff8e419e23 -[NSApplication run] + 594 
<Warning>: void CGSUpdateManager::log() const: 22 AppKit        0x00007fff8e4052d4 NSApplicationMain + 1832 
<Warning>: void CGSUpdateManager::log() const: 23 MyApp        0x00000001000022eb main + 75 
<Warning>: void CGSUpdateManager::log() const: 24 libdyld.dylib      0x00007fff97a025c9 start + 1 
+0

Так что вопрос; как избежать мерцания или как решить проблему? Если это последний, нам нужно будет увидеть какой-то код. – Droppy

+0

@ Droppy Вопрос в том, что может вызвать мерцание. Консольный выход не является сбоем, а просто предупреждением. Я не могу сказать, связано ли это напрямую (но вероятно). – Mark

+0

Я бы сказал, что это было связано; если вы не делаете много пользовательских чертежей в представлениях, вы не должны замечать мерцания. – Droppy

ответ

6

Для справки, я нашел причину, хотя я не могу это объяснить.

В applicationDidFinishLaunching: Я инициализировал общий экземпляр оконного контроллера и показывал его окно, вызывая showWindow:nil. В этом окне оказалось NSTableView. Этот вид таблицы вызвал мерцание в другом контурном представлении (в несвязанном окне).

Почему? Я честно понятия не имею. Я удалил все элементы управления из окна и добавил пустой вид таблицы прямо из палитры Interface Builder → возникает проблема. После удаления представления таблицы проблема исчезла.

Решение должно было не открывать окно сразу в applicationDidFinishLaunching:. Вместо этого я добавил меню, чтобы открыть его позже (это было окно с отладочной информацией).

+0

Благодарим вас за сообщение об основной причине. –

1

Мое решение было довести это окно фронт после очень небольшой задержкой, т.е .:

- (void)awakeFromNib { 
    if (WSPreferences.currentApplication.showActivityWindow) { 
     // http://stackoverflow.com/questions/27794135/nswindow-redraw-issues-flickers-when-resized 
     // 
     [self performSelector:@selector(makeKeyAndOrderFront:) withObject:self afterDelay:0.1]; 
    } 
} 
+0

, так что вы столкнулись с той же проблемой? Интересно, в чем причина этого. Может быть, ошибка, которая была введена с Йосемити? ... – Mark

Смежные вопросы