UIBarButtonItem:我怎样才能find它的框架?

我有一个工具栏中的button。 我怎样才能抓住它的框架? UIBarButtonItem是否没有frame属性?

试试这个;

 UIBarButtonItem *item = ... ; UIView *view = [item valueForKey:@"view"]; CGFloat width; if(view){ width=[view frame].size.width; } else{ width=(CGFloat)0.0 ; } 

这种方式最适合我:

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

感谢Anoop Vaidya提供的答案。 另一种可能是(提供你知道button在工具栏中的位置)

 UIView *view= (UIView *)[self.toolbar.subviews objectAtIndex:0]; // 0 for the first item CGRect viewframe = view.frame; 

使用Swift ,如果你需要经常使用barbutton项目,你应该像这样实现一个扩展:

 extension UIBarButtonItem { var frame: CGRect? { guard let view = self.value(forKey: "view") as? UIView else { return nil } return view.frame } } 

然后在你的代码中你可以轻松访问:

 if let frame = self.navigationItem.rightBarButtonItems?.first?.frame { // do whatever with frame } 
 -(CGRect) getBarItemRc :(UIBarButtonItem *)item{ UIView *view = [item valueForKey:@"view"]; return [view frame]; } 

试试这个实现:

 @implementation UIBarButtonItem(Extras) - (CGRect)frameInView:(UIView *)v { UIView *theView = self.customView; if (!theView.superview && [self respondsToSelector:@selector(view)]) { theView = [self performSelector:@selector(view)]; } UIView *parentView = theView.superview; NSArray *subviews = parentView.subviews; NSUInteger indexOfView = [subviews indexOfObject:theView]; NSUInteger subviewCount = subviews.count; if (subviewCount > 0 && indexOfView != NSNotFound) { UIView *button = [parentView.subviews objectAtIndex:indexOfView]; return [button convertRect:button.bounds toView:v]; } else { return CGRectZero; } } @end 

您应该对子视图进行循环,并检查其types或其内容以供识别。 通过kvo访问视图是不安全的,您无法确定索引。

看看这个答案: 如何将边界和angular半径应用到UIBarButtonItem? 它解释了如何遍历子视图来查找button的框架。

你可以创build一个UIBarButtonItem自定义视图,这是一个UIButton,那么你可以做任何你想要的。 :]

在这个线程中,有很多粗略的答案。 这是正确的做法:

 import UIKit class ViewController: UIViewController { let customButton = UIButton(type: .system) override func viewDidLoad() { super.viewDidLoad() customButton.setImage(UIImage(named: "myImage"), for: .normal) self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: customButton) } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) print(self.customButton.convert(self.customButton.frame, to: nil)) } }