Сделайте UINavigationBar прозрачным - PullRequest
224 голосов
/ 23 февраля 2010

Как сделать прозрачным UINavigationBar ? Хотя я хочу, чтобы элементы бара оставались видимыми.

Ответы [ 17 ]

616 голосов
/ 24 сентября 2013

Если кому-то интересно, как этого добиться в iOS 7+, вот решение (также совместимое с iOS 6)

В Objective-C

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

В Swift 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 голосов
/ 01 февраля 2012

В 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];
23 голосов
/ 16 февраля 2015

Из 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 голосов
/ 13 июня 2014

Для тех, кто хочет сделать это в 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
10 голосов
/ 23 февраля 2010

Это похоже на работу:

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

navigationController.navigationBar.backgroundColor = [UIColor clearColor];
8 голосов
/ 19 ноября 2016

После того, как все остальные сказали выше, т.е.

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

... моя панель навигации все еще была белой . Поэтому я добавил эту строку:

navigationController?.navigationBar.backgroundColor = .clear

... и вуаля! Это, казалось, сделало трюк.

5 голосов
/ 21 июня 2011

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

Это то, что вам нужно:

self.navigationController.navigationBar.translucent = YES;
self.navigationController.navigationBar.opaque = YES;
self.navigationController.navigationBar.tintColor = [UIColor clearColor];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
5 голосов
/ 05 марта 2015

Приведенный ниже код расширяет верхний ответ, выбранный для этой темы, чтобы избавиться от нижней границы и установить цвет текста:

  1. Последние две кодированные строки этого кода устанавливают прозрачность. Я позаимствовал этот код из этой ветки, и он отлично работал!

  2. Свойство "clipsToBounds" было кодом, который я нашел, который избавился от нижней границы с ИЛИ без установленной прозрачности (так что если вы решите использовать сплошной белый / черный / и т. Д. Фон, то все равно будет быть без границ).

  3. Строка "tintColor" (2-я кодированная линия) устанавливает мою кнопку возврата на светло-серый

  4. Я сохранил barTintColor в качестве резервной копии. Я не знаю, почему прозрачность не будет работать, но если это не так, я хочу, чтобы мой bg белый, как у меня был

    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()
    
2 голосов
/ 22 октября 2016

для Swift 3.0:

override func viewDidLoad() {
    super.viewDidLoad()

    navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
    navigationController?.navigationBar.shadowImage = UIImage()
    navigationController?.navigationBar.isTranslucent = true
}
2 голосов
/ 13 мая 2016

C # / Xamarin Solution

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