我需要检测NSToolbar是否已创建(或将创建)溢出菜单,并可能调整窗口大小以使溢出消失。但我找不到一种简单的方法来检测溢出已经发生。
答案 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
返回后等待一段短暂的延迟,给实际添加项目的时间,然后再次检查溢出。