我认为它并不严格符合Apple指南,但我想它一定是可能的。我想更改UINavigationController中导航栏的高度以及该栏内UIBarButtonItem元素的高度。
使用来自this question的技巧我设法改变导航栏的高度,但我看不到调整条形按钮项高度的方法。
如果有人知道如何更改条形按钮项目的大小,请帮助我。
答案 0 :(得分:18)
这是我的解决方案。它运作得很好。
@interface UINavigationBar (CustomHeight)
@end
@implementation UINavigationBar (CustomHeight)
- (CGSize)sizeThatFits:(CGSize)size {
// Change navigation bar height. The height must be even, otherwise there will be a white line above the navigation bar.
CGSize newSize = CGSizeMake(self.frame.size.width, 40);
return newSize;
}
-(void)layoutSubviews {
[super layoutSubviews];
// Make items on navigation bar vertically centered.
int i = 0;
for (UIView *view in self.subviews) {
NSLog(@"%i. %@", i, [view description]);
i++;
if (i == 0)
continue;
float centerY = self.bounds.size.height / 2.0f;
CGPoint center = view.center;
center.y = centerY;
view.center = center;
}
}
答案 1 :(得分:16)
也许有关自定义导航栏的本教程可以帮助您:Recreating the iBooks wood themed navigation bar
如果使用BarButtonItem
创建UIImageView
,则可以更改自定义UIImageView的frameize / boundsize
UIImageView* imageView = [[[UIImageView alloc] initWithFrame:navigationController.navigationBar.frame] autorelease];
imageView.contentMode = UIViewContentModeLeft;
imageView.image = [UIImage imageNamed:@"NavBar-iPhone.png"];
[navigationController.navigationBar insertSubview:imageView atIndex:0];
因此,根据您的需要,您可以为-initWithFrame
方法提供适当的值。
答案 2 :(得分:4)
static CGFloat const CustomNavigationBarHeight = 74;
@implementation WTNavigationBar
- (CGSize)sizeThatFits:(CGSize)size{
size.width = 1024;
size.height = CustomNavigationBarHeight;
return size;
}
-(void)layoutSubviews {
[super layoutSubviews];
for (UIView *view in self.subviews) {
SFLog(@"view.class=%@",[view class]);
if ([view isKindOfClass:NSClassFromString(@"UINavigationItemButtonView")]) {
float centerY = self.bounds.size.height / 2.0f;
CGPoint center = view.center;
center.y = centerY;
view.center = center;
}
}
}
@end
在我的iPad应用程序中,它具有固定的横向方向,我发现我必须硬编码大小的宽度
答案 3 :(得分:3)
我设法通过继承UINavigationBar
并覆盖-layoutSubviews
来做类似的事情。代码如下:
-(void)layoutSubviews {
[super layoutSubviews];
int i = 0;
for (UIView *view in self.subviews) {
NSLog(@"%i. %@", i++, [view description]);
if ([view isKindOfClass:NSClassFromString(@"UINavigationButton")]) {
view.frame = CGRectMake(0, 0, 100, 50);
}
}
}
如果您需要知道如何继承UINavigationBar
,请查看this very good answer。
我不太确定NSClassFromString(@" UINavigationButton")]部分。它有效,但我做了这个实验,我不确定这是否会得到Apple的批准。我希望有更好知识的人可能会有所启发。
答案 4 :(得分:3)
适用于UINavigationbar
在iOS SDK 4.3及更高版本中,有一种方法(hack)可以更改UINavigationBar的高度。
要更改UINavigationController的高度,请在viewWillAppear:animated:
函数中更改其帧大小。然后,高度将在整个应用程序中保持自定义。
对于UIBarButtonItems
我实际上遇到了这个问题,我唯一想到的就是利用initWithCustomView并传入一个带有定义框架的UIButton。
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
/*
* Insert button styling
*/
button.frame = CGRectMake(0, 0, width, height);
UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
否则UIBarButtonItem只有一个可以设置的width属性,但遗憾的是不是height属性。我用initWithCustomView做的另一件好事就是传入一个带有按钮的工具栏和其他东西,比如活动指示器。希望这会有所帮助。
答案 5 :(得分:2)
你想要这个多么糟糕?而且,你想要制作导航栏有多薄(或厚)?
一种方法是将导航栏的变换设置为缩放并进行翻译。如果你将它缩放太多,标题和按钮文字看起来会很糟糕,但是如果你只需要刮几个像素就可以了。
这是将其缩放为全高度的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