繁体   English   中英

更改UINavigationBar高度

[英]Change UINavigationBar Height

有人可以告诉我如何更改导航栏高度?

这是我到目前为止:

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

您可以像这样基于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

它非常好用。

您不应该更改导航栏的高度。 来自View Controller的Apple编程指南:

自定义导航栏外观

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

●barStyle属性

●半透明属性

●tintColor属性

(摘自Apple: 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/

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

sizeThatFits:不再适用于iOS11 UINavigationBar子类。 Apple工程公司已经证实,这项技术从未得到支持,并且iOS11更改了尺寸,因此不再需要咨询。

覆盖 - (void)viewController中的viewWillAppear方法并尝试下面的代码,

- (void)viewWillAppear {

UINavigationBar *navigationBar = [[self navigationController] navigationBar];
CGRect frame = [navigationBar frame];
frame.size.height = 82.0f;
[navigationBar setFrame:frame];
}

尝试使用 -

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

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

@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时遇到一些问题

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

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

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

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

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

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

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

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

在里面试试这个代码- (void)viewDidLayoutSubviews方法,

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

创建类别并覆盖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")
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM