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)) } }