Зробіть UINavigationBar прозорим


Відповіді:


635

Якщо когось цікавить, як цього досягти в iOS 7+, ось рішення (iOS 6 також сумісний)

В Objective-C

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

Швидкий 3 (iOS 10)

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

Швидко 2

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

Обговорення

Установка translucentдля YESнавігаційної панелі робить трюк, з - за поведінку обговорюється в UINavigationBarдокументації. Я доповім тут відповідний фрагмент:

Якщо встановити цю властивість YESна панелі навігації з непрозорим нестандартним фоновим зображенням, навігаційна панель застосує до зображення непрозорість системи менше 1,0.


29
Відповідаючи на мій власний коментар тут; щоб скасувати спробу впливу:[self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault]; self.navigationController.navigationBar.shadowImage = nil; self.navigationController.navigationBar.translucent = NO;
Йоганн Бургес

Мені потрібен лише один ВК, щоб мати прозорий навбар. Як я повернувся до оригінального стилю після виходу з цього ВК?
Гільгерме

2
щоб досягти цього в Swift з ViewController, зробіть це так: self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default) self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.translucent = true
datay yes

Працює і з використанням вигляду (iOS7 / 8), див .: gist.github.com/mpycio/ddbdea1adb6b86cf02f6
Махакали

1
Скасування ефекту для мене працює лише частково. Тому що після цього я переглядаю всі таблиці, які мають занадто великі заголовки. Додаток у всьому додатку, що дивно. (Я хочу лише цього ефекту для одного контролера, який я натискаю на стек.)
Геннінг

29

В iOS5 ви можете зробити це, щоб зробити панель навігації прозорою:

nav.navigationBar.translucent = YES; // Setting this slides the view up, underneath the nav bar (otherwise it'll appear black)
const float colorMask[6] = {222, 255, 222, 255, 222, 255};
UIImage *img = [[UIImage alloc] init];
UIImage *maskedImage = [UIImage imageWithCGImage: CGImageCreateWithMaskingColors(img.CGImage, colorMask)];

[nav.navigationBar setBackgroundImage:maskedImage forBarMetrics:UIBarMetricsDefault]; 
[img release];

6
В iOS 6 ви також захочете видалити тінь навігаційної панелі, інакше це буде виглядати дивно. [[UINavigationBar appearance] setShadowImage: [[UIImage alloc] init]];
Роберт

23

Від IOS7:

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

14

Для всіх, хто хоче це зробити у Swift 2.x:

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

або Swift 3.x:

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

2
navigationController - необов'язкова властивість, тому її потрібно розгортати. Просто додайте self.navigationController? .NavigationBar, і вам добре їхати
Даніель Галаско

10

Це, здається, працює:

@implementation UINavigationBar (custom)
- (void)drawRect:(CGRect)rect {}
@end

navigationController.navigationBar.backgroundColor = [UIColor clearColor];

6
Здається, що в iOS 5 ви повинні перекрити -drawRect:власне підклас, а не категорію, а потім використовувати цей підклас як панель навігації.
Ян Мейєр

9

Після того, як всі інші сказали вище, тобто:

navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController!.navigationBar.isTranslucent = true

... мій панель навігації був ще білим . Тому я додав цей рядок:

navigationController?.navigationBar.backgroundColor = .clear

... et voila! Це, здавалося, трюк.


7

Якщо ви будуєте за допомогою останньої бета-версії iOS 13.4 та XCode 11.4, прийнята відповідь більше не працюватиме. Я знайшов інший спосіб, можливо, це просто помилка в бета-програмі, але я записую її там, про всяк випадок

(стрімкий 5)

import UIKit

class TransparentNavBar :UINavigationBar {
    override func awakeFromNib() {
        super.awakeFromNib()
        self.setBackgroundImage(UIImage(), for: .default)
        self.shadowImage = UIImage()
        self.isTranslucent = true
        self.backgroundColor = .clear
        if #available(iOS 13.0, *) {
            self.standardAppearance.backgroundColor = .clear
            self.standardAppearance.backgroundEffect = .none
            self.standardAppearance.shadowColor = .clear
        }
    }
}

Дивовижно! Був просто пошук виправлення! Чудово працює! Дякую!
Георг

5

Я знаю, що ця тема стара, але якщо люди хочуть знати, як це робиться, не перевантажуючи метод drawRect.

Це те, що вам потрібно:

self.navigationController.navigationBar.translucent = YES;
self.navigationController.navigationBar.opaque = YES;
self.navigationController.navigationBar.tintColor = [UIColor clearColor];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];

1
Вибачте, це не правильно. Вам все одно доведеться перекрити метод drawRect
Sander

Чому це неправильно? Здається, працює в IOS 6 sim. Він не працює в IOS 5? Навігація NaviBar.backgroundColor видається недокументованою.
Крісті

5

Нижче наведений код розширюється на верхню відповідь, вибрану для цього потоку, щоб позбутися нижньої межі та встановити колір тексту:

  1. Два останні закодовані рядки цього коду встановлюють прозорість. Я запозичив цей код у цієї теми, і він відмінно працював!

  2. Властивістю "clipsToBounds" був код, який я знайшов, який позбувся нижньої межі лінії з АБО без встановленої прозорості (тому, якщо ви вирішите перейти із суцільним білим / чорним / т. Д. Фоном натомість, все одно не буде межі).

  3. Лінія "tintColor" (2-а закодована лінія) встановила кнопку "назад" світло-сірим

  4. Я зберігав barTintColor як резервну копію. Я не знаю, чому прозорість не спрацює, але якщо цього не відбувається, я хочу, щоб мій біг був білим, як раніше

    let navigationBarAppearace = UINavigationBar.appearance()
    navigationBarAppearace.tintColor = UIColor.lightGray
    navigationBarAppearace.barTintColor = UIColor.white
    navigationBarAppearace.clipsToBounds = true
    navigationBarAppearace.isTranslucent = true
    navigationBarAppearace.setBackgroundImage(UIImage(), for: .default)
    navigationBarAppearace.shadowImage = UIImage()

3

для Swift 3.0:

override func viewDidLoad() {
    super.viewDidLoad()

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

3

C # / Розчин Xamarin

NavigationController.NavigationBar.SetBackgroundImage(new UIImage(), UIBarMetrics.Default);
NavigationController.NavigationBar.ShadowImage = new UIImage();
NavigationController.NavigationBar.Translucent = true;


1

Ще один спосіб, який працював для мене, - це підклас UINavigationBar і залишити метод drawRect порожнім !!

@IBDesignable class MONavigationBar: UINavigationBar {


// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func drawRect(rect: CGRect) {
    // Drawing code
}}

1

У Swift 4.2

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

(у viewWillAppear), а потім у viewWillDisappear, щоб скасувати її, поставте

self.navigationController?.navigationBar.shadowImage = nil
self.navigationController?.navigationBar.isTranslucent = false

0

Ви маєте на увазі повністю прозорий або використовуючи напівпрозоро-чорний стиль, помічений у додатку "Фото"? Останнє ви можете досягти, встановивши його barStyleвластивість UIBarStyleBlackTranslucent. Колишній ... я в цьому не впевнений. Якщо ви хочете, щоб елементи на ньому все-таки були видимими, можливо, вам доведеться прокопати в ієрархії подання панелі та видалити подання, що містить його фон.


2
Я маю на увазі колишнього. Я спробував створити категорію та змінити метод drawRect UINavigationBar (посилаючись на CGContextClearRect), але це зробило його повністю чорним. Елементи все ще були видні.
квано

0

Це працює для Swift 2.0.

navigationController!.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
navigationController!.navigationBar.shadowImage = UIImage()
navigationController!.navigationBar.translucent = true

0

Перевірте RRViewControllerExtension , який присвячений управлінню зовнішнім виглядом панелі UINavigation.

з RRViewControllerExtension у вашому проекті вам просто потрібно перекрити

-(BOOL)prefersNavigationBarTransparent;

у вас перегляд контролера.

навігаційний бар прозорий


-2
extension UINavigationBar {
var isTransperent: Bool {
        get {
            return false // Just to satisfy property
        }
        set {
            if newValue == true {
                self.shadowImage   = UIImage()
                self.isTranslucent = true
                self.setBackgroundImage(UIImage(), for: .default)
            }else{
                self.shadowImage   = UIImage()
                self.isTranslucent = false
                self.setBackgroundImage(nil, for: .default)
            }
        }
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.