I have a button in a toolbar. How can I grab its frame? Do UIBarButtonItem
s not have a frame
property?
Here's the way to do it:
-(CGRect)findFrameOfBarButtonItem{
for (UIView *view in self.navigationController.navigationBar.subviews)
{
if ([view isKindOfClass:NSClassFromString(@"_UINavigationBarContentView")])
{
UIView * barView = [self.navigationItem.rightBarButtonItem valueForKey:@"view"];
CGRect barFrame = barView.frame;
CGRect viewFrame = [barView convertRect:barFrame toView:view];
return viewFrame;
}
}
return CGRectZero;
}
I used a view on the bar button item with a tag on the view:
for view in bottomToolbar.subviews {
if let stackView = view.subviews.filter({$0 is UIStackView}).first {
//target view has tag = 88
if let targetView = stackView.subviews.filter({$0.viewWithTag(88) != nil}).first {
//do something with target view
}
}
}
Swift 4 up The current best way to do it is to access its frame from :
self.navigationItem.rightBarButtonItems
by
let customView = navigationItem.rightBarButtonItems?.first?.customView // access the first added customView
Accessing this way is safer than accessing private api.
After Add a CustomView to navigationItem, CustomView always return nil
This way works best for me:
UIView *targetView = (UIView *)[yourBarButton performSelector:@selector(view)];
CGRect rect = targetView.frame;