Как определить положение UIBarButtonItem в UIToolbar? - PullRequest
11 голосов
/ 22 ноября 2011

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

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

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

Ответы [ 7 ]

18 голосов
/ 03 мая 2013

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

- (CGRect)frameForBarButtonItem:(UIBarButtonItem *)buttonItem
{
    UIView *view = [buttonItem valueForKey:@"view"];
    return  view ? view.frame : CGRectZero;
}
13 голосов
/ 26 ноября 2011

К сожалению, нет простого способа определить положение 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;
6 голосов
/ 09 мая 2013

Это работает для меня при использовании всплывающих окон из UIBarButtonItems.

- (void)buttonClicked:(id)sender{
{
  CGRect buttonRect = [[sender view] frame];
}
3 голосов
/ 11 февраля 2016

Более «быстрый» способ SWIFT:

func userAction(sender: AnyObject) {
    if let originView = sender.valueForKey("view") {
        let frame = originView.frame  //it's a UIBarButtonItem
    } else {
        let frame = sender.frame //it's a regular UIButton
    }
}

UIBarButtonItem НЕ является подклассом UIView, хотя по сути это кнопка. Пойди разберись.

2 голосов
/ 15 июня 2015

Я использовал подход Джохошера, чтобы получить позицию UIBarButtonItem с помощью Swift.

Так как мне нужно было положение sourceRect для popoverPresentationController, мне пришлось преобразовать его в self.view. Я не уверен, является ли это хорошим решением, но оно работает очень хорошо, и всплывающее окно показывается справа от 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
1 голос
/ 08 февраля 2019

Для iOS 11 (а может и выше) звонок:

if let view = barButtonItemView.value(forKey: "view") as? UIView {
        let viewFrame = view.frame    
}

вернет нулевую точку начала для вида. Чтобы противостоять этому, запросите координаты окна вида, используя:

let actualPointOnWindow = view.convert(view.frame.origin, to: nil)

Если на вашей панели инструментов есть какие-либо переводы, вычтите их из вычисленной точки, чтобы найти ее положение на панели инструментов.

0 голосов
/ 30 ноября 2012
UIToolbar *toolbar;

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