Я пытаюсь получить ширину UIBarButtonItem
.
Это не работает:
barbuttonitem.customView.frame.size.width
И это не сработает:
barbuttonitem.width
Я пытаюсь получить ширину UIBarButtonItem
.
Это не работает:
barbuttonitem.customView.frame.size.width
И это не сработает:
barbuttonitem.width
Как насчет этого:
UIBarButtonItem *item = /*...*/;
UIView *view = [item valueForKey:@"view"];
CGFloat width = view? [view frame].size.width : (CGFloat)0.0;
У меня была та же проблема. После многих попыток я нашел что-то, что сработало!
В моем конкретном случае мне нужно было получить ширину первого 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
Артур
Если вас интересует ширина на одном конкретном элементе, самым простым способом является наличие двух IBOutlets: один для кнопки, а другой для соответствующей кнопки панели. Вместо того, чтобы читать ширину элемента панели, вы будете читать ширину кнопки.
Этот подход, конечно, не будет работать, если вы хотите, например, для суммирования ширины в цикле. (Кстати, первая кнопка начинается с x = 12, а расстояние между двумя кнопками равно 10, если вы не делаете что-то сложное.) Конечно, у вас могут быть два массива, но это просто громоздко.
На панели инструментов всегда есть несколько подзонов.
В дополнение к ответу arthurs вы можете перебирать их и проверять его тип.
for sv in self.navigationController!.toolbar.subviews {
if sv.isKindOfClass(UIBarButtonItem.self){
let width = sv.bounds.width
}
}