Получить ширину UIBarButtonItem

Я пытаюсь получить ширину UIBarButtonItem.

Это не работает:

barbuttonitem.customView.frame.size.width

И это не сработает:

barbuttonitem.width

Ответ 1

Как насчет этого:

UIBarButtonItem *item = /*...*/;
UIView *view = [item valueForKey:@"view"];
CGFloat width = view? [view frame].size.width : (CGFloat)0.0;

Ответ 2

У меня была та же проблема. После многих попыток я нашел что-то, что сработало!

В моем конкретном случае мне нужно было получить ширину первого UIBarButtonItem с панели инструментов навигационного контроллера, но вы можете легко адаптировать его по своему вкусу:

UIToolbar *toolbar = self.navigationController.toolbar; // or whatever toolbar you need
UIView *view = (UIView *)[toolbar.subviews objectAtIndex:0]; // 0 for the first item
double itemWidth = view.bounds.size.width;

Обратите внимание: я должен был использовать этот код в viewDidLoad, чтобы получить правильное значение. В init он возвращает 0.0

Артур

Ответ 3

Если вас интересует ширина на одном конкретном элементе, самым простым способом является наличие двух IBOutlets: один для кнопки, а другой для соответствующей кнопки панели. Вместо того, чтобы читать ширину элемента панели, вы будете читать ширину кнопки.

Этот подход, конечно, не будет работать, если вы хотите, например, для суммирования ширины в цикле. (Кстати, первая кнопка начинается с x = 12, а расстояние между двумя кнопками равно 10, если вы не делаете что-то сложное.) Конечно, у вас могут быть два массива, но это просто громоздко.

Ответ 4

На панели инструментов всегда есть несколько подзонов.

В дополнение к ответу arthurs вы можете перебирать их и проверять его тип.

for sv in self.navigationController!.toolbar.subviews {
        if sv.isKindOfClass(UIBarButtonItem.self){
            let width = sv.bounds.width
        }
    }