有没有办法检测NSToolbar上的溢出

时间:2013-11-26 12:52:33

标签: cocoa appkit nstoolbar

我需要检测NSToolbar是否已创建(或将创建)溢出菜单,并可能调整窗口大小以使溢出消失。但我找不到一种简单的方法来检测溢出已经发生。

1 个答案:

答案 0 :(得分:1)

NSToolbar有两种方法可用于解决这个问题。 -items返回工具栏中的所有当前项,包括溢出菜单中的项。 -visibleItems仅返回可见的项目,不包括溢出菜单中的项目。如果这两个方法返回的数组不匹配(或者只是不包含相同数量的项),则表示工具栏已溢出。当窗口调整大小时,或者在工具栏中添加或删除项目时,溢出状态可能会发生变化。所以,你可以这样做:

- (void)checkForToolbarOverflow
{
    if ([[self.toolbar items] count] > [[self.toolbar visibleItems] count]) {
        NSLog(@"Overflow!");
    } else {
        NSLog(@"No overflow");
    }
}

- (void)windowDidResize:(NSNotification *)notification
{
    [self checkForToolbarOverflow];
}

- (void)toolbarDidRemoveItem:(NSNotification *)notification
{
    [self checkForToolbarOverflow];
}

- (void)toolbarWillAddItem:(NSNotification *)notification
{
    [self checkForToolbarOverflow];
}

这有一个错误,即如果在工具栏的末尾添加了一个新项目,它将错误地报告没有溢出,并且该项导致溢出。事实证明,在调用-toolbarWillAddItem:时,要添加的项目不在items或visibleItems数组中(正如您所期望的那样,因为尚未添加)。但是,visibleItems数组已更新,以反映新近不可见的项目。只要新项目不是唯一不可见的项目,它就会很好用,因为它也不会在items数组中。

我的解决方法并不理想,但我还没有想出更好的东西。它只是在-toolbarWillAddItem返回后等待一段短暂的延迟,给实际添加项目的时间,然后再次检查溢出。