2

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

4

1 回答 1

2

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 数组更新以反映新近不可见的项目。只要新项目不是唯一不可见的项目,这很有效,因为它也不会在项目数组中。

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

于 2013-11-26T17:42:33.827 回答