Как определить положение UIBarButtonItem в UIToolbar?

Какой самый простой способ определить местоположение x, y UIBarButtonItem в UIToolbar?

Единственный ответ, который я нашел, находится в чтобы узнать, где был нарисован uibarbuttonitem.

Все предлагаемые ответы кажутся слишком сложными. Должен быть более простой способ получить позицию проклятого UIBarButtonItem, не так ли?

Ответ 1

Я использовал это, что кажется самым элегантным способом

- (CGRect)frameForBarButtonItem:(UIBarButtonItem *)buttonItem
{
    UIView *view = [buttonItem valueForKey:@"view"];
    return  view ? view.frame : CGRectZero;
}

Ответ 2

К сожалению, нет простого способа определить положение 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;

Ответ 3

Это работает для меня при использовании popovers из UIBarButtonItems.

- (void)buttonClicked:(id)sender{
{
  CGRect buttonRect = [[sender view] frame];
}

Ответ 4

Я использовал подход 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

Ответ 5

Более "быстрый" способ 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, хотя это, по сути, кнопка. Наведите указатель мыши.

Ответ 6

UIToolbar *toolbar;

for (UIView *v in [toolbar items]) 
{
    if ([v isKindOfClass:[UIBarButtonItem class]])
    {
        UIBarButtonItem *b = (UIBarButtonItem*)v;
        //do something with b..
    }
}