我需要在UINavigationBar中调整我的UIBarButtonItem的垂直位置。我认为有一种方法可以做到这一点。要向UIBarButtonItem添加UIView并将UIButton添加到UIView。如果你只有一个或两个导航栏就可以了。但是我认为如果你有几十个UINavigationBar特别是在故事板里面,这有点太麻烦了。所以我做了一些研究,找到了一个简单的解决方案。那就是使用类别。这是我的源代码:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
-(void)viewWillAppear:(BOOL)animated
{
[self show:NO];
}
// do your override
-(void)viewWillLayoutSubviews
{
[self changeTheButtonPosition:self.navigationItem.leftBarButtonItem];
[self changeTheButtonPosition:self.navigationItem.rightBarButtonItem];
}
-(void)viewDidAppear:(BOOL)animated
{
[self show:YES];
}
#pragma clang diagnostic pop
-(void)show:(BOOL)show
{
self.navigationItem.leftBarButtonItem.customView.hidden = !show;
self.navigationItem.rightBarButtonItem.customView.hidden = !show;
}
- (void)changeTheButtonPosition:(UIBarButtonItem *)barButtonItem
{
if ( barButtonItem )
{
UIView* customView = barButtonItem.customView;
// NSLog(@"custom view frame = %@",NSStringFromCGRect(customView.frame));
CGRect frame = customView.frame;
CGFloat y = SYSTEM_VERSION_LESS_THAN(@"7") ? 10.0f : 5.0f;
customView.frame = CGRectMake(frame.origin.x, y, frame.size.width, frame.size.height);
}
}
它在iOS 7和iOS 6中的第一个视图控制器中运行良好。但它不适用于iOS 6中推送的UIViewController。我找不到任何理由。有人可以提供建议吗?我在iOS 6中的代码出了什么问题?
答案 0 :(得分:2)
您应该能够使用iOS5中引入的UIAppearance
代理方法实现此目的。特别是:
- (void)setBackgroundVerticalPositionAdjustment:(CGFloat)adjustment forBarMetrics:(UIBarMetrics)barMetrics
- (void)setTitlePositionAdjustment:(UIOffset)adjustment forBarMetrics:(UIBarMetrics)barMetrics
查看UIBarButtonItem
docs了解详情。