iOSナビゲーションバー背景画像、カスタム戻りボタン、ステータスバー色変換

5052 ワード

ステータスバーの色の変更


ステータスバー(バッテリタイムバー)の2つの色、黒または白で、設定をしない場合、システムのデフォルトは黒のステータスバーです.ページが濃い色の場合、白いステータスバーはかなりきれいに見えますが、どのように白いステータスバーを表示しますか?方法は、対応するコントローラで次の方法を書き換えることです.
- (UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
}

グローバル設定アプリのステータスバーが白い場合は、ViewControllerベースクラスと書いて、このベースクラスにこのStatusBarStyleを設定する方法を書いて、アプリケーション内のすべてのコントローラがこのベースクラスを継承すればいいです.これが設定されてから、まだ役に立たないことに気づきました.もう一つの方法を書き直さなければなりません
- (UIViewController *)childViewControllerForStatusBarStyle {
    return self.topViewController;
}

通常使用しているviewControllerは、UInavigationControllerでネストされています.この関数の戻り値はデフォルトでnilです.UInavigationControllerをネストすると、ステータスバーをロードするときにまずnavigationControllerのchildViewControllerForStatusBarStyle関数が呼び出されます.デフォルトでnilが返されるため、次にViewController自体のpreferredStatusBarStyle関数が呼び出されます.したがって、viewControllerでpreferredStatusBarStyle関数で設定したステータスバースタイルは呼び出されず、無効になります.そこで、UINavigationcontrollerに継承されたNavigationControllerを作成します.このサブクラスではchildViewControllerForStatusBarStyle関数を書き換え、最上位のviewControllerを返すと、viewControllerのpreferredStatusBarStyle関数が呼び出されます.
ページでステータスバーの色を動的に変更する必要がある場合は、preferredStatusBarStyleという方法で変数値に基づいてステータスバーを変更し、ステータスバーを変更する場合は、次の方法を呼び出して、すぐにステータスバーを更新する必要があります.
[self setNeedsStatusBarAppearanceUpdate];

ナビゲーションバーの背景画像の設定


ナビゲーションバーの背景画像を設定します.必要なページが1つしかない場合は、コントローラで個別に設定します.アプリケーションのナビゲーションバー全体がカスタムの画像である場合は、UINavigationcontrollerから継承されたNavigationControllerを作成し、NavigationControllerで背景画像を設定する必要があります.次のコード例は、NavigationControllerで設定されています.
- (void)viewDidLoad {
    [super viewDidLoad];
    //    ,                  
    UIImage *backImage = [[UIImage imageNamed:@"nav_background"] resizableImageWithCapInsets:UIEdgeInsetsZero resizingMode:UIImageResizingModeStretch];
    //         
    [self.navigationBar setBackgroundImage:backImage forBarMetrics:UIBarMetricsDefault];
    
    //          
    [self.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}];
    //  tintColor
    [self.navigationBar setTintColor:[UIColor whiteColor]];
}

「カスタム戻り」ボタン


多くの場合、戻るボタンをカスタマイズする必要があります.ナビゲーションバーの左側のボタンが、常にその戻るボタンである場合は、以下の方法で設定し、コードを簡潔にします.まず、ベースクラスviewControllerを定義し、すべてのviewControllerをこのベースクラスに継承し、ベースクラスで設定します.
- (void)viewDidLoad {
    [super viewDidLoad];
    
    //        
    self.navigationController.navigationBar.backIndicatorImage = [UIImage imageNamed:@"nav_back_icon"];
    self.navigationController.navigationBar.backIndicatorTransitionMaskImage = [UIImage imageNamed:@"nav_back_icon"];
    //       title  ,             nav_back_icon  
    UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
    self.navigationItem.backBarButtonItem = backItem;
    
}

しかし、このような方法で戻るボタンを定義するのは、気まずいことに、戻るボタンをクリックしてどんな方法をトリガーしたのか分からない.アップルはシステムの戻るボタンのクリック方法を暴露していない.このようなニーズがある場合、ユーザはそのページでいくつかの情報を変更し、前のページに戻ることをクリックすると、通知を送信し、他のページに情報の更新を通知する必要がある場合がある.ネット上でこのニーズを実現する方法を見つけました.
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    //         /    
    if ([self.navigationController.viewControllers indexOfObject:self] == NSNotFound) {
        //     
    }
}

カスタムリターンボタンには、ベースクラスviewControllerでカスタムleftBarButtonItemをリターンボタンとして実装する別の実装方法があります.
- (void)viewDidLoad {
    [super viewDidLoad];

    //       
    self.leftBarButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [self.leftBarButton setImage:[UIImage imageNamed:@"nav_back_icon"] forState:UIControlStateNormal];
    self.leftBarButton.frame = CGRectMake(0, 0, 40, 40);
    self.leftBarButton.imageEdgeInsets = UIEdgeInsetsMake(0, -18, 0, 0);
    [self.leftBarButton addTarget:self action:@selector(leftButtonClicked) forControlEvents:UIControlEventTouchUpInside];
    
    if (self.navigationController.viewControllers.count > 1) {
        self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:self.leftBarButton];
    }
    
}

- (void)leftButtonClicked {
    [self.navigationController popViewControllerAnimated:YES];
}

leftButtonClicked法を暴露することができる.hでは、このようにリターンボタンをクリックしてこの方法をトリガし、サブviewControllerでこの方法を書き換え、クリックリターンを実現していくつかの操作を実行することができる.このカスタムleftBarButtonItemがもたらす問題は、サイドスライドが機能しなくなったことです.解決策は、NavigationControllerでジェスチャーエージェントを書き直し、エージェントを実現することです.
- (void)viewDidLoad {
    [super viewDidLoad];
    
    //    ,    
    self.interactivePopGestureRecognizer.delegate = self;
}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    if (self.childViewControllers.count > 1) {
        return YES;
    }
    return NO;
}

以上が、戻りボタンをカスタマイズする2つの方法で、問題があれば指摘してください.