如何确定UIToolBbar中UIBarButtonItem的位置?

时间:2011-11-22 18:21:50

标签: ios uibarbuttonitem uitoolbar

确定UIToolBbar中UIBarButtonItem的x,y位置的最简单方法是什么?

我找到的唯一答案是any way to know where uibarbuttonitem has been drawn

所有提出的答案似乎都太复杂了。应该有一个更简单的方法来获得该死的UIBarButtonItem的位置不存在?

7 个答案:

答案 0 :(得分:18)

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

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

答案 1 :(得分:13)

不幸的是,没有简单的方法来确定UIBarButtonItem的位置。 UIBarButtonItem本质上是一个NSObject,只做两件事:描述工具栏按钮的外观,并将事件转发到指定的目标/动作选择器。

现在,假设所有按钮都是UIToolbar的子视图,并且所有按钮事件都通过各自的UIBarButtonItem路由,那么遍历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;

答案 2 :(得分:6)

当使用来自UIBarButtonItems的弹出式窗口时,这适用于我。

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

答案 3 :(得分:3)

更加敏捷&#39; 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的子类,即使它本质上是一个按钮。去图。

答案 4 :(得分:2)

我使用johosher的方法来获取使用Swift的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

答案 5 :(得分:1)

对于iOS 11(或更高版本),请致电:

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

将为视图返回零点原点。为了解决这个问题,请使用以下命令索取视图的窗口坐标:

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

如果工具栏上有任何平移,请从计算点中减去它们,以找到其在工具栏上的位置。

答案 6 :(得分:0)

UIToolbar *toolbar;

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