如何确定UIToolBbar中UIBarButtonItem的位置?

His*_*ham 11 uitoolbar uibarbuttonitem ios

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

我发现的唯一答案是以任何方式知道uibarbuttonitem的绘制位置.

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

小智 18

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

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


Jam*_* Hu 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;
Run Code Online (Sandbox Code Playgroud)

  • 如果用UIControl替换UIButton,它可以工作. (4认同)

Rob*_*ill 6

当使用来自UIBarButtonItems的弹出框时,这适用于我.

- (void)buttonClicked:(id)sender{
{
  CGRect buttonRect = [[sender view] frame];
}
Run Code Online (Sandbox Code Playgroud)


Don*_*uel 5

对于 iOS 11(或许更高版本)调用:

if let view = barButtonItemView.value(forKey: "view") as? UIView {
        let viewFrame = view.frame    
}
Run Code Online (Sandbox Code Playgroud)

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

let actualPointOnWindow = view.convert(view.frame.origin, to: nil)
Run Code Online (Sandbox Code Playgroud)

如果您的工具栏有任何翻译,从计算的点中减去它们以找到它在工具栏上的位置。

完整代码:

if let view = barButtonItemView.value(forKey: "view") as? UIView {
        let viewFrame = view.frame    
}
Run Code Online (Sandbox Code Playgroud)