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

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


person Erik Elmgren    schedule 26.11.2013    source источник


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

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

person Andrew Madsen    schedule 26.11.2013
comment
Спасибо! Ваш checkForToolbarOverflow работает нормально, хотя мне пришлось подключить его в другом месте (мой собственный код после открытия окна). И я сомневаюсь, что вызов в toolbarWillAddItem будет очень полезен, поскольку он выполняется до добавления элемента (а DidAddItem отсутствует). - person Erik Elmgren; 28.11.2013
comment
Рад, что смог помочь! Как я объяснил в своем ответе, проверка в -toolbarWillAddItem: на самом деле действительно работает, за исключением случая, когда добавляемый элемент будет крайним правым и вызовет переполнение панели инструментов. Было бы неплохо, если бы NSToolbarDelegate включал _2 _... - person Andrew Madsen; 28.11.2013