Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos NSWindow重绘问题/调整大小时闪烁_Macos_Cocoa_Core Graphics_Nswindow - Fatal编程技术网

Macos NSWindow重绘问题/调整大小时闪烁

Macos NSWindow重绘问题/调整大小时闪烁,macos,cocoa,core-graphics,nswindow,Macos,Cocoa,Core Graphics,Nswindow,我最近注意到,当我调整应用程序窗口的大小时,应用程序中的一些控件(NSTableView和NSOutlineView)会闪烁 我不明白为什么会这样。我将应用程序缩减到最低限度:一个文档窗口控制器,带有一个包含大纲视图和按钮的窗口。没有后台处理,没有加载文档数据等 下面是一个屏幕截图,显示了调整窗口大小期间的UI片段: 请注意顶部轮廓视图的片段、白色背景和偏移窗口阴影 控制台中还有一个与核心图形相关的警告(见下文)。不确定是否与问题有关 该应用程序在Mac OS X 10.10.1上运行,部署目

我最近注意到,当我调整应用程序窗口的大小时,应用程序中的一些控件(NSTableView和NSOutlineView)会闪烁

我不明白为什么会这样。我将应用程序缩减到最低限度:一个文档窗口控制器,带有一个包含大纲视图和按钮的窗口。没有后台处理,没有加载文档数据等

下面是一个屏幕截图,显示了调整窗口大小期间的UI片段:

请注意顶部轮廓视图的片段、白色背景和偏移窗口阴影

控制台中还有一个与核心图形相关的警告(见下文)。不确定是否与问题有关

该应用程序在Mac OS X 10.10.1上运行,部署目标和基本SDK设置为10.9

控制台输出(不是崩溃):

:void CGSUpdateManager::log()常量:conn 0x22833令牌0x10DFFFFFFF3823
:回溯(4250.73):
:void CGSUpdateManager::log()常量:0 CoreGraphics 0x00007fff986f5215 CGSBacktraceCreate+59
:void CGSUpdateManager::log()常量:1 CoreGraphics 0x00007fff98714688\u zn16cgsupdatemanager14禁用\u updateEv+84
:void CGSUpdateManager::log()常量:2 AppKit 0x00007fff8e4e2de5-[NSWindow disableScreenUpdatesUntilFlush]+127
:void CGSUpdateManager::log()常量:3 AppKit 0x00007fff8e4a2250-[NSView\u gainedlayertreehostsenter]+385
:void CGSUpdateManager::log()常量:4 AppKit 0x00007fff8e4a20ae-[NSView\u recursivegainedLayerTreehostAncenter]+27
:void CGSUpdateManager::log()常量:5 AppKit 0x00007fff8e4a667a-[NSScroller\u recursiveGainedLayerTreeHost]+103
:void CGSUpdateManager::log()常量:6 AppKit 0x00007fff8e70da56-[nscroller\u setSurfaceBacked:+213
:void CGSUpdateManager::log()常量:7 AppKit 0x00007fff8e67324f-[NSScrollView setScrollerStyle:+304
:void CGSUpdateManager::log()常量:8 AppKit 0x00007fff8ed0af27+[NSScrollerImpPair\u updateAllScrolleripPairsFornerEncrededScrollerStyle:+426
:void CGSUpdateManager::log()常量:9 CoreFoundation 0x00007fff8b36fcbc\uuu\uu CFNOTIFICATIONCENTER\u正在调用\u OUT\u到\u观察员\uuuu+12
:void CGSUpdateManager::log()常量:10 CoreFoundation 0x00007fff8b2611b4\u CFXNotificationPost+3140
空:cgSuffDeMaMaGe::Log.()const:11基金会0x000 7FFF8B5F8EA1- [ NSnPosiCICTeCsPoestNoTrimeTrimeNo::ObjeNoFi::] + 66
:void CGSUpdateManager::log()常量:12 CoreFoundation 0x00007fff8b2d154c\uu CFRUNLOOP\u正在调用\u OUT\u到\u块
:void CGSUpdateManager::log()常量:13 CoreFoundation 0x00007fff8b2c3655
:void CGSUpdateManager::log()常量:14 CoreFoundation 0x00007fff8b2c2e0e\uuu CFRunLoopRun+910
:void CGSUpdateManager::log()常量:15 CoreFoundation 0x00007fff8b2c2838 CFRunLoopRunSpecific+296
:void CGSUpdateManager::log()常量:16 HIToolbox 0x00007fff9980043f RunCurrentEventLoopInMode+235
:void CGSUpdateManager::log()常量:17 HIToolbox 0x00007fff998000be ReceiveNextEventCommon+179
:void CGSUpdateManager::log()常量:18 HIToolbox 0x00007fff997ffffb_blockuntinextEventMatchingListinModewithFilter+71
:void CGSUpdateManager::log()常量:19 AppKit 0x00007fff8e4266d1\u dpsnextent+964
:void CGSUpdateManager::log()常量:20 AppKit 0x00007fff8e425e80-[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:+194
:void CGSUpdateManager::log()常量:21 AppKit 0x00007fff8e419e23-[NSApplication run]+594
:void CGSUpdateManager::log()常量:22 AppKit 0x00007fff8e4052d4 NSApplicationMain+1832
:void CGSUpdateManager::log()常量:23 MyApp 0x00000001000022eb main+75
:void CGSUpdateManager::log()常量:24 libdyld.dylib 0x00007fff97a025c9 start+1

作为参考,我找到了根本原因,尽管我无法解释

ApplicationIDFinishLaunching:
中,我正在初始化窗口控制器的共享实例,并通过调用
showWindow:nil
显示其窗口。该窗口碰巧包含一个
NSTableView
。此表视图导致另一个大纲视图(在不相关的窗口中)中闪烁

为什么??我真的不知道。我从窗口中删除了所有控件,并从Interface Builder调色板中添加了一个空表视图→ 问题出现了。删除表视图后,问题消失了


解决方案是不立即在
ApplicationIDFinishLaunching:
中打开窗口。相反,我添加了一个菜单以在以后打开它(无论如何,这是一个包含调试信息的窗口)。

我的解决方案是在非常小的延迟后将该窗口提前,即:

- (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];
    }
}

那么问题是什么;如何避免闪烁或如何解决崩溃?如果是后者,那么我们需要看一些代码。@Droppy问题是什么可能导致闪烁。控制台输出不是崩溃,只是警告。我不知道这是否是直接相关的(但很可能);除非你在视图中做了大量的自定义绘图,否则你不会注意到任何闪烁。没有自定义绘图,只有屏幕截图中显示的窗口。我无法在另一个测试项目中重现这一点,因此我怀疑可能是该项目的Xcode构建设置或另一个库干扰了绘图…感谢您发布根本原因。因此,您可以
- (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];
    }
}