Есть ли способ обнаружить переполнение на NSToolbar

Мне нужно обнаружить, что NSToolbar создал (или создаст) меню переполнения и, возможно, отрегулировать размер окна, чтобы переполнение исчезло. Но я не могу найти простой способ обнаружить, что переполнение произошло.

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: называется, элемент, который будет добавлен, отсутствует в массивах элементов или visibleItems (как и следовало ожидать, поскольку он еще не был добавлен). Однако массив visibleItems был обновлен, чтобы отразить новые невидимые элементы. Это прекрасно работает до тех пор, пока новый элемент не является единственным невидимым элементом, так как он также не будет в массиве элементов.

Мой обходной путь для этого не идеален, но я не придумал что-то лучшее. Это просто ждать короткую задержку после -toolbarWillAddItem возвращает, давая время для фактического добавления элемента, затем снова проверьте на переполнение.

Другие вопросы по тегам