【问题标题】:Change iPhone navigation bar's height更改 iPhone 导航栏高度
【发布时间】:2010-10-27 22:23:43
【问题描述】:

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

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

非常感谢!

【问题讨论】:

  • 我添加了一个完整的例子来说明如何做到这一点。

标签: iphone uinavigationbar


【解决方案1】:

更新:今天(2012 年)自定义 UI 的趋势更大,所以我想说下面的答案太苛刻了。但是,仍然没有支持自定义高度的方法,但是您当然可以从 UINavigationBar 派生并覆盖一些调整大小的方法。这可能不会让你被拒绝(尽管它仍然是一个灰色区域,只是 Apple 今天可能会忽略的东西)。

获得所需大小后,您可以使用 iOS 5 自定义 API 添加自定义背景图像(请参阅 WWDC 2011 Session 114 - Customizing the Appearance of UIKit Controls)。

2009 年的原始答案:

这通常是不可能的。

还有,我认为让导航栏变高是违规的 Apple 人机界面指南,您的应用程序可能是 因此被 App Store 拒绝。请确保您的 客户在继续之前了解此风险。

(指出拒绝风险通常是说服他人的好方法 客户反对做出无意义的决定。)

【讨论】:

  • 导航栏字体变大怎么样?这可能和/或允许吗?
  • 至少您可以使用自定义标题视图,所以我会尽可能地考虑这一点。另外,我认为您不会因为自定义标题视图而被拒绝,因此应该是安全的。我不建议尝试使用按钮的字体大小。
  • 不同意。首先 - 可以通过子类化和覆盖 - (CGSize)sizeThatFits:(CGSize)size。第二 - 我在应用商店看到了许多带有自定义导航栏的漂亮应用。有时,为您的应用提供完全自定义的导航栏是有意义的。
  • @AvrahamShukron 同意不同意。我的观点在 2009 年可能是合理的,但今天肯定不是。
【解决方案2】:

如果您决定只更改导航栏中的字体大小,您可以这样做(通常在您的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];

【讨论】:

    【解决方案3】:

    通过子类化您可以实现这一点并且仍然支持 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 值来解决此问题。

    【讨论】:

      【解决方案4】:

      您不应更改导航栏的高度。来自 Apple Programing Guide on View Controller:

      自定义导航栏外观

      在导航界面中,导航控制器拥有它的 UINavigationBar 对象并负责管理它。不允许更改导航栏对象或直接修改其边界、框架或 alpha 值。但是,允许修改一些属性,包括:

      ● barStyle 属性

      ● 半透明属性

      ● 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/

      【讨论】:

        【解决方案5】:

        这里的许多答案不正确或不完整,所以我想在这里添加我的答案,希望它可以启发一些人。

        首先,改变导航栏的高度并没有错。评论说它不允许或违反准则的人只是误解了这些准则。

        自 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!
        【解决方案6】:

        补充斯凯拉的答案:

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

        然后在类中实现改变高度

        @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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-29
          • 2011-01-22
          • 1970-01-01
          相关资源
          最近更新 更多