你有多想要这个?而且,你想让你的导航栏有多薄(或多厚)?
一种方法是将导航栏的变换设置为缩放并翻译它。如果缩放太多,标题和按钮文本会看起来很奇怪,但如果你只需要刮掉几个像素就可以了。
这是将其缩放为全高的 75%(33 像素高)的结果:
以及产生这个的代码:
- (void)viewDidLoad
{
[super viewDidLoad];
self.navigationItem.title = @"Thin Navigation Bar";
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle: @"Press Me" style:UIBarButtonItemStyleBordered target: nil action: NULL ] autorelease];
CGFloat scale = .75;
CGFloat cy = 44.0 - ( 44.0 * scale );
self.navigationController.navigationBar.transform = CGAffineTransformScale( CGAffineTransformMakeTranslation( 0, -cy / 2.0 ), 1.0, scale ) ;
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
CGFloat scale = .75;
CGFloat cy = 44.0 - ( 44.0 * scale );
CGRect r = self.view.frame;
r.origin.y -= cy;
r.size.height += cy;
self.view.frame = r;
}
现在,这确实存在许多问题,这些问题可能解决也可能无法解决。 #1 是您正在使用 UINavigationController 来调整导航栏和视图控制器视图的大小和位置。使用这种技术的视图控制器之间的动画可能看起来很奇怪。
如果您能解决相关问题,我会很好奇...
最后一个想法:如果你不使用 UINavigationController,那么除了压扁的文本之外,真的没有很多问题。或者,您可以使用导航控制器但隐藏默认导航栏,并将细导航栏添加到您的每个子视图控制器视图。您甚至可以继承 UINavigationBar 并从内部设置转换:
@interface TSThinNavBar : UINavigationBar
{
}
@end
@implementation TSThinNavBar
// assuming we'll always be constructed from a nib
- (id) initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder: aDecoder];
if ( self != nil )
{
CGFloat scale = .75;
CGFloat cy = 44.0 - ( 44.0 * scale );
self.transform = CGAffineTransformScale( CGAffineTransformMakeTranslation( 0, -cy / 2.0 ), 1.0, scale ) ;
}
return self;
}
@end