Як зробити повністю прозору панель навігації в iOS 7


127

Я хочу, щоб UINavigationBar у моєму додатку був повністю прозорим і нарівні з контролером перегляду безпосередньо під ним. Однак єдиний код, який я міг знайти, робить його напівпрозорим, але не прозорим. Я знаю, що це можна зробити в iOS 7, оскільки він використовується в додатку для приміток. Моє запитання: який код вони використовували для цього?

Відповіді:


295

З цієї відповіді

[self.navigationController.navigationBar setBackgroundImage:[UIImage new]
                     forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.shadowImage = [UIImage new];
self.navigationController.navigationBar.translucent = YES;
self.navigationController.view.backgroundColor = [UIColor clearColor];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];

Крім того, як запропонував Джош у коментарях, щоб повернути планку до типового:

[self.navigationController.navigationBar setBackgroundImage:nil
                     forBarMetrics:UIBarMetricsDefault];

6
Також переконайтеся, що у вас немаєself.edgesForExtendedLayout = UIRectEdgeNone;
daidai

25
Чи є спосіб це змінити?
Зорайр

12
@Zorayr [self.navigationController.navigationBar setBackgroundImage: nil forBarMetrics: UIBarMetricsDefault]; поверне планку до типового.
Джош

7
Чи є спосіб переключити прозорість навігаційної панелі, анімовану за допомогою цього методу?
JYC

3
Я реалізую це на scrollViewDidScroll і є стрибок. Як виправити?
onmyway133

77

Для Swift3 та Swift4

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true

Для Swift2.2

 self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
 self.navigationController?.navigationBar.shadowImage = UIImage()
 self.navigationController?.navigationBar.translucent = true

Для Objective-C

[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.shadowImage = [UIImage new];
self.navigationController.navigationBar.translucent = YES;

1
Дякую, це простий спосіб налаштувати навігаційну панель на абсолютно прозору
Hong Zhou

39

Самостійне рішення як категорія Objective-C:

UINavigationController + TransparentNavigationController.h

@interface UINavigationController (TransparentNavigationController)
- (void)presentTransparentNavigationBar;
- (void)hideTransparentNavigationBar;
@end

UINavigationController + TransparentNavigationController.m

#import "UINavigationController+TransparentNavigationController.h"

@implementation UINavigationController (TransparentNavigationController)

- (void)presentTransparentNavigationBar
{
  [self.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
  [self.navigationBar setTranslucent:YES];
  [self.navigationBar setShadowImage:[UIImage new]];
  [self setNavigationBarHidden:NO animated:YES];
}

- (void)hideTransparentNavigationBar
{
  [self setNavigationBarHidden:YES animated:NO];
  [self.navigationBar setBackgroundImage:[[UINavigationBar appearance] backgroundImageForBarMetrics:UIBarMetricsDefault] forBarMetrics:UIBarMetricsDefault];
  [self.navigationBar setTranslucent:[[UINavigationBar appearance] isTranslucent]];
  [self.navigationBar setShadowImage:[[UINavigationBar appearance] shadowImage]];
}

@end

Тепер ви можете імпортувати категорію у свій UIViewControllerі викликати методи на вашому навігаційному контролері - наприклад:

#import "UINavigationController+TransparentNavigationController.h"

- (void)viewWillAppear:(BOOL)animated
{
  [super viewWillAppear:animated];
  [self.navigationController presentTransparentNavigationBar];
}

- (void)viewWillDisappear:(BOOL)animated
{
  [super viewWillDisappear:animated];
  [self.navigationController hideTransparentNavigationBar];
}

І подібне рішення у Свіфта :

import Foundation
import UIKit

extension UINavigationController {

  public func presentTransparentNavigationBar() {
    navigationBar.setBackgroundImage(UIImage(), forBarMetrics:UIBarMetrics.Default)
    navigationBar.translucent = true
    navigationBar.shadowImage = UIImage()
    setNavigationBarHidden(false, animated:true)
  }

  public func hideTransparentNavigationBar() {
    setNavigationBarHidden(true, animated:false)
    navigationBar.setBackgroundImage(UINavigationBar.appearance().backgroundImageForBarMetrics(UIBarMetrics.Default), forBarMetrics:UIBarMetrics.Default)
    navigationBar.translucent = UINavigationBar.appearance().translucent
    navigationBar.shadowImage = UINavigationBar.appearance().shadowImage
  }
}

Як я можу показати це ще раз (наприклад, якщо я не хочу зробити його прозорим лише в 1 перегляді в NavigationController?) - чи можу я відновити його до значень за замовчуванням?
дердида

hideTransparentNavigationBar()слід скинути його назад.
Зорайр

Виклик методів присутності / приховування в viewWillAppear / išče викликає погану анімацію переходу між двома панелями навігації! Ви можете це добре побачити, зробивши жест пальцем (зліва направо) у націленомуViewController
andreacipriani

Спробуйте зателефонувати в viewDidHideбатьківський контролер подання.
Зорайр

1
Чорний фон показаний на iOS 11 при використанні LargeTitle, коли ховається прозорий
навбар

15

Алан забув один рядок

self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];

Отже, у мене є:

[self.navigationController.navigationBar setTranslucent:YES];
self.navigationController.view.backgroundColor = [UIColor clearColor];
[self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];

5

@ Zorayr чудова відповідь переглянуто на Swift 3:

import Foundation
import UIKit

extension UINavigationController {

    public func presentTransparentNavigationBar() {
        navigationBar.setBackgroundImage(UIImage(), for:.default)
        navigationBar.isTranslucent = true
        navigationBar.shadowImage = UIImage()
        setNavigationBarHidden(false, animated:true)
    }

    public func hideTransparentNavigationBar() {
        setNavigationBarHidden(true, animated:false)
        navigationBar.setBackgroundImage(UINavigationBar.appearance().backgroundImage(for: UIBarMetrics.default), for:.default)
        navigationBar.isTranslucent = UINavigationBar.appearance().isTranslucent
        navigationBar.shadowImage = UINavigationBar.appearance().shadowImage
    }
}

2

Swift 4.2 та iOS 12

Виявляється, все, що вам дійсно потрібно, - це код нижче. Він прекрасно працює, коли ви вводите його viewDidLoad().

// removes line at bottom of navigation bar
navigationController?.navigationBar.shadowImage = UIImage()

// makes navigation bar completely transparent
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.isTranslucent = true


-4

[(UIView *) [self.navigationController.navigationBar.subviews objectAtIndex: 0] setAlpha: 0.0f];

Ця одна лінія, здавалося, прекрасно працює для мене

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.