Как сделать полностью прозрачную панель навигации в 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
Есть ли способ изменить это?
Зорайр 05
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;
vichhai
источник
1
Спасибо, это простой способ сделать панель навигации полностью прозрачной
Хун Чжоу
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];
}

И аналогичное решение в Swift :

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
  }
}
Zorayr
источник
Как я могу показать его снова (например, если я хочу сделать его прозрачным только в одном представлении в NavigationController?) - могу ли я сбросить его до значений по умолчанию?
derdida
hideTransparentNavigationBar()следует сбросить его обратно.
Зорайр
Вызов методов present / hide в viewWillAppear / Исчезновение вызывает плохую анимацию перехода между двумя разными панелями навигации! Вы можете очень хорошо это увидеть, сделав жест смахивания (слева направо) в p PushViewController
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
    }
}
Diphaze
источник
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
Trev14
источник
-3

Используйте модуль UINavigationBar + Addition , затем просто вызовите:

UINavigationBar *navigationBar = self.navigationController.navigationBar;
[navigationBar makeTransparent];
samwize
источник
-4

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

Эта одна строка, казалось, отлично работала для меня

user5679976
источник