ナビゲーションバーの高さを変更する方法を教えてください。
ここに私がこれまで持っているものがあります:
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
とてもいい感じです。
ナビゲーションバーの高さを変更しないでください。 From Apple View Controllerのプログラミングガイド:
ナビゲーションバーの外観のカスタマイズ
ナビゲーションインターフェイスでは、Navigation ControllerはそのUINavigationBarオブジェクトを所有し、それを管理します。ナビゲーションバーオブジェクトを変更したり、その境界、フレーム、またはアルファ値を直接変更することは許可されていません。ただし、次のようないくつかの変更可能なプロパティがあります。
●barStyleプロパティ
●半透明のプロパティ
●tintColorプロパティ
-UPDATE-IOS 7 ---まだ利用可能なプロパティのみを変更できますが、以下はナビゲーションバーの柔軟性を実現する方法に関する素晴らしいチュートリアルです http:// www.appcoda.com/customize-navigation-status-bar-ios-7/
この問題を解決し、UINavigationControllerのサブクラスを作成しました。このMainNavigationViewController.mファイル内で、self.navigationBarのフレームを設定するviewDidLayoutSubviews()メソッドを書き換えます
sizeThatFits:iOS11 UINavigationBarサブクラスでは動作しなくなりました。 Appleこの技術は決してサポートされておらず、iOS11の変更によりsizeThatFits:のコンサルティングは行われていません。
ViewControllerの-(void)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は、ナビゲーションバーの高さです。 UINavigationBarのフレームが間違っているため、UIScreen境界を使用します
PS:注意してください、あなたはSideMenuでそれを使用していくつかの問題がある可能性があります
self.navigationController.navigationBar.frame
は、iOSバージョン4.xのreadonly
プロパティです
変更されますが、異常な動作が見られます。
たとえば、アプリの状態がバックグラウンドに変更されてフォアグラウンドに戻ると、ナビゲーションバーに元のサイズの高さが表示されます
選択した方法によっては、多くの問題に遭遇しました。私の特定のケースでは、設定ビューコントローラーを除いて、アプリ全体でナビゲーションバーが非表示になりました。ナビゲーションバーのカスタムの高さを指定すると同時にナビゲーションバーを表示する必要があるため、ソースビューコントローラーと設定ビューコントローラーの間のセグエは非常にずさんなアニメーションでした。
絶対的な最善の解決策は、ここにあります: https://Gist.github.com/maciekish/c2c903d9b7e7b583b4b2 。カテゴリをSettings View Controllerにインポートし、viewDidLoad
でsetHeight:
「self.navigationController.navigationBar」のメソッド。素晴らしく見える!
次のコードは、高さ以外のフレームの他のパラメーターには影響しません
[self.navigationController.navigationBar setFrame:CGRectMake(self.navigationController.navigationBar.frame.Origin.x, self.navigationController.navigationBar.frame.Origin.y, self.navigationController.navigationBar.frame.size.width, 150)];
他のパラメータを変更したい場合は、いずれかのパラメータを編集してください。
カテゴリの作成とオーバーライドsizeThatFits(_ size:CGSize)-> CGSizeメソッドはアプリ全体でUINavigationBarのサイズを変更します。 1つの特定の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")
}
- (void)viewDidLayoutSubviews
メソッド内でこのコードを試してください。
CGFloat navBarHeight = 10.0f;
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight);
[self.navigationController.navigationBar setFrame:frame];