更改 iPhone 导航栏高度

5

我的客户无法阅读iPhone的默认字体,字体太小了。我有一个带有导航栏的应用程序,我需要使其中的所有内容变大,例如字体大小。

IB似乎不允许这样做...有什么帮助吗?

非常感谢!


我添加了一个完整的示例来说明如何做到这一点。 - Avi Shukron
6个回答

13
更新:今天(2012年)更倾向于自定义UI,所以我认为下面的答案过于严厉。虽然仍然没有支持自定义高度的方法,但您可以从UINavigationBar派生并覆盖一些大小调整方法。这可能不会被拒绝(尽管这仍然是一个灰色地带,只是苹果今天可能会忽略它)。
一旦您获得所需的大小,您可以使用iOS 5自定义API添加自定义背景图像(请参见WWDC 2011 Session 114 - Customizing the Appearance of UIKit Controls)。
原始答案来自2009年:
这通常是不可能的。
而且,我认为使导航栏变高违反了苹果人机界面指南,因此您的应用程序可能会因此被App Store拒绝。在继续之前,请确保您的客户了解这种风险。
(指出拒绝风险通常是说服客户不做无意义决定的好方法。)

导航栏的字体变大如何?这是可行和/或允许的吗? - Hectoret
至少你可以使用自定义标题视图,所以我认为这是可能的。此外,我不认为您会因为自定义标题视图而被拒绝,所以应该是安全的。我不建议尝试调整按钮的字体大小。 - Andrey Tarantsov
不同意。第一,可以通过子类化和覆盖-(CGSize)sizeThatFits:(CGSize)size来实现。第二,我在App Store上看到了许多具有自定义导航栏的漂亮应用程序。有时为您的应用程序拥有完全定制的导航栏是有意义的。 - Avi Shukron
4
@AvrahamShukron 表示同意但也有不同意见。我的观点可能在2009年是合理的,但现在肯定不是了。 - Andrey Tarantsov

11

这里的许多答案都是错误或不完整的,因此我想在这里添加我的答案,希望它能启发一些人。

首先,改变导航栏的高度没有任何问题。评论中说它不被允许或违反了指南的人只是误解了这些指南。

自iOS 5以来,调整或更改UINavigationController内使用的默认导航栏的能力已成为SDK的一部分。

- (instancetype)initWithNavigationBarClass:(Class)navigationBarClass toolbarClass:(Class)toolbarClass NS_AVAILABLE_IOS(5_0);

改变状态栏高度的最简单方法是在初始化导航控制器时使用此方法,传入您的自定义UINavigationBar子类。

TestViewController *t = [[TestViewController alloc] init];
UINavigationController *nav = [[UINavigationController alloc] initWithNavigationBarClass:[MyNavigationBar class] toolbarClass:[UIToolbar class]];
[nav setViewControllers:@[t]];  
[self.window setRootViewController:nav];
[self.window makeKeyAndVisible];

一个自定义的UINavigationBar类的示例可能如下:

@interface MyNavigationBar : UINavigationBar
@end

@implementation MyNavigationBar

- (CGSize)sizeThatFits:(CGSize)size
{
        CGSize s = [super sizeThatFits:size];
        s.height = 90; // Or some other height
        return s;
}

@end

这就是答案 - 你太棒了 @Skela! - amergin

7
如果您决定仅更改导航栏中的字体大小,可以在UIViewControllerviewDidLoad方法中执行以下操作:
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];

[titleLabel setBackgroundColor:[UIColor clearColor]];
// here's where you can customize the font size
[titleLabel setFont:[UIFont boldSystemFontOfSize:18.0]];
[titleLabel setTextColor:[UIColor whiteColor]];
[titleLabel setText:self.title];
[titleLabel sizeToFit];
[titleLabel setCenter:[self.navigationItem.titleView center]];

[self.navigationItem setTitleView:titleLabel];

[titleLabel release];

5
通过子类化,您可以实现这一点,并仍然支持iOS 3+:

完整示例:

#import <UIKit/UIKit.h>

@interface ASNavigationBar : UINavigationBar
@property (nonatomic , retain) UIImage *backgroundImage;
@end

实施:

#import "ASNavigationBar.h"

@implementation ASNavigationBar
@synthesize backgroundImage = _backgroundImage;

-(void) setBackgroundImage:(UIImage *)backgroundImage
{
    if (_backgroundImage != backgroundImage)
    {
        [_backgroundImage release];
        _backgroundImage = [backgroundImage retain];
        [self setNeedsDisplay];
    }
}

-(void) drawRect:(CGRect)rect
{
    // This is how the custom BG image is actually drawn
    [self.backgroundImage drawInRect:rect];
}

- (CGSize)sizeThatFits:(CGSize)size 
{
    // This is how you set the custom size of your UINavigationBar
    CGRect frame = [UIScreen mainScreen].applicationFrame;
    CGSize newSize = CGSizeMake(frame.size.width , self.backgroundImage.size.height);
    return newSize;
}
@end

重要提示:

  1. 如果背景图片有透明区域,则必须将其barStyle属性设置为“半透明”,否则透明区域将变为黑色。
  2. 如果您的NavigationBar高度超过44个点,则必须考虑BarButtonItems的位置可能不正确。它们都将锚定在栏底部。您可以通过覆盖layoutSubviews并更改它们的origin.y值来修复它们。

2
根据苹果编程指南中的View Controller,您不应更改导航栏的高度。
在导航界面中,导航控制器拥有其UINavigationBar对象并负责管理它。不允许直接更改导航栏对象或修改其边界、框架或alpha值。但是,有一些属性是可以修改的,包括以下内容:
● barStyle属性
● translucent属性
● tintColor属性
(摘自苹果:https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/NavigationControllers.html
更新--IOS 7--仍然只能更改可用属性,但以下是关于如何在导航栏中实现灵活性的很棒的教程:http://www.appcoda.com/customize-navigation-status-bar-ios-7/

0

补充Skela的答案:

如果您在Storyboard中启动导航控制器,您可以在Storyboard中更改UINavigationBar的类为您的自定义导航栏。

enter image description here

enter image description here

然后在类中实现更改高度

@interface MyNavigationBar : UINavigationBar
@end

@implementation SwitchAssessmentNavigationBar

- (CGSize)sizeThatFits:(CGSize)size
{
        CGSize s = [super sizeThatFits:size];
        s.height = 200; // Or some other height
        return s;
}

@end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接