簡體   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