Сделать UINavigationBar прозрачный


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

15 213

15 ответов:

если кто-то задается вопросом, как достичь этого в iOS 7+, вот решение (iOS 6 совместимый тоже)

В Объективе-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

в swift 2

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

Обсуждение

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

если вы установите это свойство в YES на панели навигации с непрозрачным пользовательским фоновым изображением панель навигации будет применять к изображению непрозрачность системы менее 1,0.

в 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];

от 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];

для тех, кто хочет сделать это в 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

Это, кажется, работает:

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

navigationController.navigationBar.backgroundColor = [UIColor clearColor];

после выполнения того, что все остальные сказали выше, т. е.:

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

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

navigationController?.navigationBar.backgroundColor = .clear

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

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

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

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

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

  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()
    

попробуйте следующий фрагмент кода:

self.navigationController.navigationBar.translucent = YES;

для Swift 3.0:

override func viewDidLoad() {
    super.viewDidLoad()

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

C# / Xamarin Solution

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

еще один способ, который работал для меня, - это подкласс 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
}}

Вы имеете в виду полностью прозрачный, или с помощью полупрозрачного черного стиля видно в приложении Фотографии? Последнее вы можете выполнить, установив его barStyle свойство UIBarStyleBlackTranslucent. Первый... Я не уверен. Если вы хотите, чтобы элементы на нем все еще были видны, вам, возможно, придется немного покопаться в иерархии представлений панели и удалить представление, содержащее его фон.

это работает для Swift 2.0.

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

Регистрация RRViewControllerExtension, которое предназначено на управлении возникновения адвокатского сословия UINavigation.

С RRViewControllerExtension в вашем проекте, вам просто нужно переопределить

-(BOOL)prefersNavigationBarTransparent;

в вас viewcontroller.

navigation bar tranparent