如何确定UIToolbar的UIBarButtonItem的位置?

问题描述 投票:10回答:7

什么是确定在UIToolbar一个的UIBarButtonItem的x,y位置的最简单的方法?

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

所有提出的答案显得过于复杂。就必须有一个更简单的方式来获得该死的UIBarButtonItem的位置是不是有?

ios uibarbuttonitem uitoolbar
7个回答
18
投票

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

- (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;

6
投票

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

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

3
投票

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


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

2
投票

对于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
投票
UIToolbar *toolbar;

for (UIView *v in [toolbar items]) 
{
    if ([v isKindOfClass:[UIBarButtonItem class]])
    {
        UIBarButtonItem *b = (UIBarButtonItem*)v;
        //do something with b..
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.