【问题标题】:Change UINavigationBar Height更改 UINavigationBar 高度
【发布时间】:2010-10-28 01:20:31
【问题描述】:

谁能告诉我如何改变导航栏的高度?

这是我目前所拥有的:

CGFloat navBarHeight = 10;
self.navigationController.navigationBar.frame.size.width = navBarHeight;

【问题讨论】:

标签: iphone ios cocoa-touch height uinavigationbar


【解决方案1】:

你可以像这样基于UINavigationBar创建一个类别类

.h 文件

#import UIKit/UIKit.h    
@interface UINavigationBar (myNave)
- (CGSize)changeHeight:(CGSize)size;
@end

和.m文件

#import "UINavigationBar+customNav.h"
@implementation UINavigationBar (customNav)
- (CGSize)sizeThatFits:(CGSize)size {
    CGSize newSize = CGSizeMake(320,100);
    return newSize;
}
@end

效果很好。

【讨论】:

  • 这可行,但将 UINavigationItem 移动到顶部,标题和项目不再水平居中对齐
  • @Anand :同样的问题,有什么解决办法吗?
  • 要使标题居中,请使用[self.navigationBar setTitleVeritcalPositionAdjustment:(float) forBarMetrics:UIBarMetricsDefault];,其中float 是向下推动标题的正值,以及向上推动标题的负值。因此,如果您的导航栏为 44(默认)并且您将其设为 60,请将 float 设置为 -8 ((60-44)/2) 以使其居中
【解决方案2】:

您不应更改导航栏的高度。 来自 Apple Programming 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/

【讨论】:

【解决方案3】:

我已经解决了这个问题,我创建了 UINavigationController 的子类。在这个 MainNavigationViewController.m 文件中,我重写了 viewDidLayoutSubviews() 方法,在这里我为 self.navigationBar 设置了框架

【讨论】:

    【解决方案4】:

    sizeThatFits:不再适用于 iOS11 UINavigationBar 子类。 Apple Engineering 已确认该技术从未受到支持,并且随着 iOS11 的更改 sizeThatFits: 不再被咨询。

    【讨论】:

      【解决方案5】:

      在 viewController 中重写 -(void)viewWillAppear 方法并尝试下面的代码,

      - (void)viewWillAppear {
      
      UINavigationBar *navigationBar = [[self navigationController] navigationBar];
      CGRect frame = [navigationBar frame];
      frame.size.height = 82.0f;
      [navigationBar setFrame:frame];
      }
      

      【讨论】:

      • 关闭,但这将与底层视图重叠而不是移动它。
      • 这可能是因为您的导航栏样式。如果它是半透明类型,那么它将与视图重叠。我认为如果它是不透明的,那么子视图可能会自动向下移动。
      • 不,前 44px 在不透明时会很好,但之后的所有内容都会重叠。我还发现 navigationBar 框架将在屏幕旋转或应用恢复时重置(应用恢复时不会调用 viewWillAppear)。很遗憾,这个 hack 无法正常工作。
      【解决方案6】:

      尝试使用 -

      CGFloat navBarHeight = 10.0f;    
      CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight);
      [self.navigationController.navigationBar setFrame:frame];
      

      【讨论】:

      • 实际上并没有改变任何东西。我在 AppDelegate 中创建 UINavigationController 时尝试设置框架。没有错误消息或任何东西,但导航栏高度根本没有改变。使用 Xcode 4.4 和 iOS 4.3、5.0、5.1 测试。
      【解决方案7】:

      最简单有效的解决方案是在导航栏中添加一个类别。 (但也许不是最好的解决方案)

      @interface UINavigationBar (CustomHeight)
      
      @end
      
      
      @implementation UINavigationBar (CustomHeight)
      
      - (CGSize)sizeThatFits:(CGSize)size {
          CGRect screenRect = [[UIScreen mainScreen] bounds];
          return CGSizeMake(screenRect.size.width, kNavBarHeightNoStatus);
      }
      @end
      

      knavBarHeightNoStatus 是导航栏的高度。我们使用 UIScreen 边界是因为 UINavigationBar 的框架是错误的

      PS:小心,使用 SideMenu 可能会遇到一些问题

      【讨论】:

        【解决方案8】:

        self.navigationController.navigationBar.frame 是 iOS 4.x 版上的 readonly 属性

        它会被改变,即使你会看到异常行为。

        例如,当应用程序状态更改为后台并返回到前台时,导航栏将显示原始大小的高度

        【讨论】:

          【解决方案9】:

          根据选择的方法,我遇到了很多问题。在我的具体情况下,导航栏隐藏在整个应用程序中,但在设置视图控制器中除外。由于我需要指定导航栏的自定义高度并同时显示导航栏,源视图控制器和设置视图控制器之间的segue 有一个非常草率的动画。

          可以在这里找到绝对最佳的解决方案:https://gist.github.com/maciekish/c2c903d9b7e7b583b4b2。我刚刚将类别导入设置视图控制器,并在viewDidLoad 中调用了`self.navigationController.navigationBar' 上的setHeight: 方法。看起来很棒!

          【讨论】:

            【解决方案10】:

            以下代码不会影响框架中除高度以外的其他参数

             [self.navigationController.navigationBar setFrame:CGRectMake(self.navigationController.navigationBar.frame.origin.x, self.navigationController.navigationBar.frame.origin.y, self.navigationController.navigationBar.frame.size.width, 150)];
            

            如果您想更改其他参数意味着,只需编辑任何一个参数......

            【讨论】:

              【解决方案11】:

              - (void)viewDidLayoutSubviews 方法中试试这段代码,

              CGFloat navBarHeight = 10.0f;    
              CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight);
              [self.navigationController.navigationBar setFrame:frame];
              

              【讨论】:

                【解决方案12】:

                创建类别并覆盖 sizeThatFits(_ size: CGSize) -> CGSize 方法会更改整个应用程序的 UINavigationBar 大小。假设您只想在一个特定的 ViewController 中更改 UINavigationBar 高度/大小(在我的情况下)

                我就是这样做的。

                extension UINavigationBar {
                    open override func sizeThatFits(_ size: CGSize) -> CGSize {
                        let v = self.value(forKey: "frame") as? CGRect
                        return v?.size ?? CGSize(width: UIScreen.main.bounds.width, height: 44)
                    }
                }
                

                在调用者 ViewController 中看起来像

                override func viewDidLoad() {
                    super.viewDidLoad()
                    configureNavigationBar()
                }
                
                private func configureNavigationBar() {
                    var naviBarFrame = self.navigationController?.navigationBar.frame
                    naviBarFrame?.size.height = 74
                    let rect = naviBarFrame ?? CGRect(x: 0, y: 20, width: UIScreen.main.bounds.width, height: 74)
                    self.navigationController?.navigationBar.setValue(rect, forKey: "frame")
                }
                

                【讨论】:

                  猜你喜欢
                  • 2012-08-15
                  • 2012-03-21
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-01-13
                  • 2018-09-30
                  • 2012-06-14
                  • 1970-01-01
                  相关资源
                  最近更新 更多