Ответ 1
Я использовал это, что кажется самым элегантным способом
- (CGRect)frameForBarButtonItem:(UIBarButtonItem *)buttonItem
{
UIView *view = [buttonItem valueForKey:@"view"];
return view ? view.frame : CGRectZero;
}
Какой самый простой способ определить местоположение x, y UIBarButtonItem в UIToolbar?
Единственный ответ, который я нашел, находится в чтобы узнать, где был нарисован uibarbuttonitem.
Все предлагаемые ответы кажутся слишком сложными. Должен быть более простой способ получить позицию проклятого UIBarButtonItem, не так ли?
Я использовал это, что кажется самым элегантным способом
- (CGRect)frameForBarButtonItem:(UIBarButtonItem *)buttonItem
{
UIView *view = [buttonItem valueForKey:@"view"];
return view ? view.frame : CGRectZero;
}
К сожалению, нет простого способа определить положение UIBarButtonItem. UIBarButtonItem - это, по сути, NSObject, который выполняет только две вещи: описать внешний вид кнопки панели инструментов и переслать события в назначенный селектор цели/действия.
Теперь, учитывая, что все кнопки представляют собой подпрограммы UIToolbar, и все события кнопок маршрутизируются через соответствующие UIBarButtonItems, довольно тривиально перебирать все подзоны вашего UIToolbar и когда вы найдете кнопку, цель которой - ваша UIBarButtonItem, просто получите рамку этой кнопки. Некоторый код:
UIToolbar *toolbar = <your toolbar>;
UIBarButtonItem *barButtonItem = <your item>;
UIButton *button = nil;
for (UIView *subview in toolbar.subviews) {
if ([subview isKindOfClass:[UIButton class]]) {
for (id target in [(UIButton *)subview allTargets]) {
if (target == barButtonItem) {
button = (UIButton *)subview;
break;
}
}
if (button != nil) break;
}
}
CGRect frame = button.frame;
Это работает для меня при использовании popovers из UIBarButtonItems.
- (void)buttonClicked:(id)sender{
{
CGRect buttonRect = [[sender view] frame];
}
Я использовал подход johosher, чтобы получить позицию UIBarButtonItem с помощью Swift.
Поскольку мне нужна была позиция sourceRect для popoverPresentationController, мне пришлось преобразовать его в self.view. Я не уверен, это хорошее решение, но оно работает очень хорошо, и popover демонстрирует право на UIBarButtonItem.
let senderRect = sender.view!!.convertRect(sender.view!!.bounds, toView: self.view)
// additional code for the popover controller
alertController.modalPresentationStyle = UIModalPresentationStyle.Popover
alertController.popoverPresentationController?.sourceRect = senderRect
alertController.popoverPresentationController?.sourceView = self.view
Более "быстрый" способ SWIFT:
func userAction(sender: AnyObject) {
if let originView = sender.valueForKey("view") {
let frame = originView.frame //it a UIBarButtonItem
} else {
let frame = sender.frame //it a regular UIButton
}
}
UIBarButtonItem НЕ является подклассом UIView, хотя это, по сути, кнопка. Наведите указатель мыши.
UIToolbar *toolbar;
for (UIView *v in [toolbar items])
{
if ([v isKindOfClass:[UIBarButtonItem class]])
{
UIBarButtonItem *b = (UIBarButtonItem*)v;
//do something with b..
}
}