2011-11-22 130 views

回答

12

不幸的是,没有简单的方法来确定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; 
+0

这似乎不适用于我在iOS 5中。 – Jon

+4

它可以工作,如果你用UIControl替换UIButton。 –

+0

编辑答案将UIButton更改为UIControl。 –

0
UIToolbar *toolbar; 

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

这是否回答了确定位置的问题?它似乎不是非正式的。 – corsiKa

+0

还没有..但你可以访问UIBarButtonItem //toolbar.subviews不工作//尝试改进答案 – morex87

17

我用这似乎是最优雅的方式

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

应该接受 – Husam

+1

它不工作在ios 11 – Sree

6

利用UIBarButtonItems popovers时,这对我的作品。

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

我用johosher的做法得到利用斯威夫特一的UIBarButtonItem的位置。

由于我需要位置作为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 
+0

谢谢你,这个作品完美的与斯威夫特2.0 –

2

更多的 'SWIFTY' 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的子类,即使它本质上是一个按钮。去搞清楚。