ドリブルをクロールしていたところ、付属のデザインが見つかりました。このようにカスタムナビゲーションバーを作成する方法を知りました。ナビゲーションバーを一度作成して、すべてのビューコントローラーで暗黙的に再利用する方法を意味します。
私はある種のルートビューコントローラーを持ち、他のビューコントローラーを継承することを考えていましたが、これを行う方法がわかりません。
どんなアイデアやリンクも届きます!
乾杯。
シリル
IOS5のおかげで、サブクラス化したり、カテゴリを作成したりすることなく、UINavigationBarの外観をカスタマイズできるようになりました。
次のコードブロック(applicationDidFinishLoading:メソッドに配置)は、アプリケーション全体のUINavigationBarを、指定した画像に変更します。
注、これはiOS5でのみ機能します
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"nav bar.png"] forBarMetrics:UIBarMetricsDefault];
ただし、viewDidLoadで次のコードを使用して、現在のビューコントローラーに応じて単一のUINavigationBarの外観を変更することもできます。
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"nav bar.png"] forBarMetrics:UIBarMetricsDefault];
上記のコードは、iOS5のおかげでUINavigationBarの外観をカスタマイズする新しい方法についてのみ説明しています。ただし、ボタンの実装方法については説明していません。
ただし、ボタンの追加はまったく別のゲームです。このため、UINavigationBar
をサブクラス化してから、必要に応じてボタンを追加することをお勧めします。おそらく、特定のビューで実行される標準のUINavigationBar
だけでなくカスタムのUIBarButtonItem
sを使用することもできます。
例えば:
UIView *rightButton = [[[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 30.0f, 30.0f)] autorelease];
[rightButton addSubview:[UIImage imageNamed:@"rightButtonImage.png"]];
UIBarButtonItem *rightButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:rightButton] autorelease];
[rightButtonItem setAction:@selector(rightButtonAction:)];
私はそのコードをテストしていないので、コピー/貼り付けソリューションではありませんが、「カスタム」に見えるUIBarButtonItemsを実現するために何を実行する必要があるかがわかります。
幸運を!
古いiOSバージョンでは、UINavigationBarをサブクラス化する必要があります。
@interface CustomNavigationBar : UINavigationBar
@end
@implementation CustomNavigationBar
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) {
self.opaque = YES;
self.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"CustomBackground"]];
}
return self;
}
- (void)drawRect:(CGRect)rect {
// Skip standard bar drawing
}
@end
ビューコントローラーでカスタムナビゲーションバーを使用するには、XIBで標準クラス名をCustomNavigationBar
に変更する必要があります。
また、プログラムでカスタムナビゲーションバーを設定することもできます。
UIViewController *tempController = [[[UIViewController alloc] init] autorelease];
UINavigationController *navigationController = [[[UINavigationController alloc] initWithRootViewController:tempController] autorelease];
NSData *archive = [NSKeyedArchiver archivedDataWithRootObject:navigationController];
NSKeyedUnarchiver *unarchiver = [[[NSKeyedUnarchiver alloc] initForReadingWithData:archive] autorelease];
[unarchiver setClass:[CustomNavigationBar class] forClassName:@"UINavigationBar"];
UINavigationController *customNavigationController = [unarchiver decodeObjectForKey:@"root"];
UIViewController *contentController = [[[ContentViewController alloc] init] autorelease];
customNavigationController.viewControllers = [NSArray arrayWithObject:contentController];
customNavigationController
にカスタムナビゲーションバーが追加されました。
navigationBarのカスタム背景を設定する
UIImage *navBackground =[[UIImage imageNamed:@"navbarBackground"]
resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
[[UINavigationBar appearance] setBackgroundImage:navBackground forBarMetrics:UIBarMetricsDefault];
次に、View Controllerで、left、rightBarButtons、titleのカスタムビューを設定します。
self.navigationItem.titleView = customTitleView;
self.navigationItem.leftBarButtonItem = customBarButton;
self.navigationItem.rightBarButtonItem = customBarButton2;
独自のUINavigationBar
サブクラスを作成し、navigationControllerが必要な場所で使用する必要があります。
このカスタムクラスでは、背景、ボタン、テキストなどを描画します。
実際、この例をよく見ると、UIToolBar
のようです。 popViewController:
などのボタンにナビゲーションメソッドを割り当てることができます。「情報の確認」と進行状況インジケーターには、ラベルと画像を使用できます。右ボタンは、単なるグラフィックです。
もちろん、提供した例は単なる概念であり、実際のアプリではありません。しかし、いくらかの創造性、数時間のコーディング、さらに数時間のグラフィックデザインにより、これと同じインターフェイスを実現できます。
Category
を使用して、デリゲートファイル(.m)に以下のコードを追加します
@implementation UINavigationBar (UINavigationBarCategory)
- (void)drawRect:(CGRect)rect
{
UIImage *navBg = [UIImage imageNamed:@"NavBar.png"];
[navBg drawInRect:CGRectMake(0, 0, 320, 44)];
}
@end
編集:
Category
を使用するのは良い方法ではありません。Category
を使用せずにデモを作成しました。 ここ をクリックしてください。
IOSでの最近のプロジェクトの1つについて多くの調査を行った後、UINavigationControllerを使用せずにナビゲーションバーのみをカスタマイズするためにサブクラスを使用することにしました。
import UIKit
class CustomNavigationBar: UINavigationBar {
override func awakeFromNib() {
super.awakeFromNib()
self.setBackgroundImageOfNavBar(imagenName: "navbar.jpg")
self.setShadowImageOfNavBar(imagenName: "")
self.setTitleAttribute()
self.setBarAsTranslucent()
}
func setBackgroundImageOfNavBar(imagenName:String){
//pass the image name and set the image here
self.setBackgroundImage(UIImage(named: imagenName), for: .default)
//if you want white backgroung just remove the image
// self.setBackgroundImage(UIImage(), for: .default)
//if you want to set backgroung color
self.backgroundColor = UIColor.clear
}
func setShadowImageOfNavBar(imagenName:String){
//pass the image name and set the image here
// self.shadowImage = UIImage(named: imagenName)
//if you want white backgroung just remove the image
self.shadowImage = UIImage()
}
func setTitleAttribute(){
//add NSAttributedStringKey as you want to customize title Color and font provide your app font family name open below commented code
// let textAttributes = [NSAttributedStringKey.foregroundColor:UIColor.black,NSAttributedStringKey.font: UIFont(name: "Enter Your App Font Name", size: 18)!]
//set only title color of navigation bar by below code
let textAttributes = [NSAttributedStringKey.foregroundColor:#colorLiteral(red: 0.8784313725, green: 0.1882352941, blue: 0.3254901961, alpha: 1)]
self.titleTextAttributes = textAttributes
}
func setBarAsTranslucent(){
self.isTranslucent = false
}
}
私は共有しています 多くのカスタム設定を行うリンク 背景画像、テキストシャドウなどの追加を含みます。
ストックUINavigationControllerを使用して、UINavigationBarを非表示にすることができます。
次に、すべてのナビゲーション要素を持つUIViewControllerの独自のサブクラスを作成し、次にコンテンツが移動するフレックスサイズのビューを作成します。すべてのクラスをこの要素のサブクラスにして、ビューに描画します。ボタンは単に[self.navigationController popViewControllerAnimated:YES]
を呼び出す必要があり、ビューのUILabelはそのテキストをself.title
に設定するだけです。