如何确定UIToolbar中UIBarButtonItem的位置?

13

如何最简单地确定UIToolbar中UIBarButtonItem的x,y位置?

我找到的唯一答案在任何方法可以知道uibarbuttonitem被绘制的位置

所有提出的答案看起来都太复杂了。肯定有更简单的方法来获取该死的UIBarButtonItem的位置,不是吗?

7个回答

19

我使用了这个方法,似乎是最优雅的方式

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

13

很遗憾,没有一种简单的方法来确定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;

修改了答案以将 UIButton 更改为 UIControl。 - Eric G

6

在使用来自UIBarButtonItems的弹出窗时,这对我有用。

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

5

对于 iOS 11 (或更高版本),以下调用方式:

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

将返回视图的零点原点。为了解决这个问题,可以通过以下方式请求视图的窗口坐标:

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

如果您的工具栏有任何翻译,请从计算出的点中减去它们,以找到其在工具栏上的位置。
完整代码:
if let view = barButtonItemView.value(forKey: "view") as? UIView {
     let viewFrame = view.frame    
     let actualPointOnWindow = view.convert(view.frame.origin, to: nil)
}

3
更加迅速的 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

我使用了johosher的方法来获取Swift中UIBarButtonItem的位置。

由于我需要将位置作为popoverPresentationController的sourceRect,因此必须将其转换为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

0
UIToolbar *toolbar;

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

这是否回答了确定位置的问题?乍一看似乎不是。 - corsiKa
尚未有解决办法。但是您可以访问UIBarButtonItem//toolbar.subviews,不起作用//尝试改进答案。 - morex87

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接