在Cocoa Touch中更改其中导航栏和UIBarButtonItem元素的高度

时间:2011-11-27 13:01:01

标签: cocoa-touch uinavigationcontroller uinavigationbar uibarbuttonitem

我认为它并不严格符合Apple指南,但我想它一定是可能的。我想更改UINavigationController中导航栏的高度以及该栏内UIBarButtonItem元素的高度。

使用来自this question的技巧我设法改变导航栏的高度,但我看不到调整条形按钮项高度的方法。

如果有人知道如何更改条形按钮项目的大小,请帮助我。

6 个答案:

答案 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像素高)的结果:

enter image description here

产生这个的代码:

- (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