如何获取UIBarButtonItem的框架?

时间:2013-01-04 18:52:16

标签: objective-c ios cocoa-touch

我正在尝试获取UIBarButtonItem的框架,它只是从UIBarItem / NSObject继承。

4 个答案:

答案 0 :(得分:6)

在iOS 5.0,5.1和6.0中,使用以下方法。可以很容易地修改此方法以与UIToolBar一起使用。

- (UIControl *) findBarButtonItem:(UIBarButtonItem *)barButtonItem
{
    UINavigationBar *toolbar = self.navigationController.navigationBar;
    UIControl *button = nil;
    for (UIView *subview in toolbar.subviews) {
        if ([subview isKindOfClass:[UIControl class]]) {
            for (id target in [(UIControl *)subview allTargets]) {
                if (target == barButtonItem) {
                    button = (UIControl *)subview;
                    break;
                }
            }
            if (button != nil) break;
        }
    }

    return button;
}

用法:

UIControl *barButton = [self findBarButtonItem:myBarButtonItem];
CGRect barButtonFrame = barButton.frame;

答案 1 :(得分:6)

这种方式最适合我:

UIView *targetView = (UIView *)[yourBarButton performSelector:@selector(view)];
CGRect rect = targetView.frame;

答案 2 :(得分:5)

我知道您发布此问题是为了发布您找到的答案。我想我会添加一个替代解决方案,不会有未来iOS更新的风险。

如果您使用自定义视图创建UIBarButtonItem,则可以访问customView的{​​{1}}属性。 UIBarButtonItem的{​​{1}}将反映其在工具栏或导航栏中的位置。

显然,此解决方案会阻止您使用标准系统定义的按钮。但您可以使用自己的图像轻松复制它们。

通常,您使用的自定义视图是带有适当图标图像的frame。一个技巧是确保启用按钮的customView属性,以便获得通常的高亮效果。

使用您在UIButton上使用的相同目标/操作设置showsTouchWhenHighlighted

答案 3 :(得分:0)

这是一种无需诉诸无证行为或假设的方法。

使用带有自定义视图的UIBarButtonItem,而不是使用UIBarButtonSystemItem。您可以使用类似这样的技术从UIBarButtonSystemItem获取图像:

Use UIBarButtonItem icon in UIButton