Как сделать прозрачный UINavigationBar? Хотя я хочу, чтобы его элементы бара оставались видимыми.
Сделать UINavigationBar прозрачным
Ответ 1
Если кто-то задается вопросом, как этого добиться в 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.
Ответ 2
В 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];
Ответ 3
Из 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];
Ответ 4
Для тех, кто хочет сделать это в 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
Ответ 5
Это работает:
@implementation UINavigationBar (custom)
- (void)drawRect:(CGRect)rect {}
@end
navigationController.navigationBar.backgroundColor = [UIColor clearColor];
Ответ 6
Я знаю, что эта тема старая, но если люди хотят знать, как ее сделать, не перегружая метод drawRect.
Это то, что вам нужно:
self.navigationController.navigationBar.translucent = YES;
self.navigationController.navigationBar.opaque = YES;
self.navigationController.navigationBar.tintColor = [UIColor clearColor];
self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
Ответ 7
После того, как все остальные сказали выше, то есть:
navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController!.navigationBar.isTranslucent = true
... моя панель навигации была еще белой. Поэтому я добавил эту строку:
navigationController?.navigationBar.backgroundColor = .clear
... et voila! Казалось, это трюк.
Ответ 8
Попробуйте следующий фрагмент кода:
self.navigationController.navigationBar.translucent = YES;
Ответ 9
Приведенный ниже код расширяет верхний ответ, выбранный для этого потока, чтобы избавиться от нижней границы и задать цвет текста:
-
Последние две кодированные строки этого кода устанавливают прозрачность. Я заимствовал этот код из этого потока, и он отлично работает!
-
Свойство "clipsToBounds" было кодом, который я нашел, который избавился от нижней граничной линии с OR без установленного прозрачности (так что если вы решите пойти с твердым белым/черным/и т.д. вместо этого, не быть границей).
-
Строка "tintColor" (2-я кодированная линия) устанавливает мою заднюю кнопку на светло-серый
-
Я сохранил barTintColor в качестве резервной копии. Я не знаю, почему прозрачность не сработает, но если это не так, я хочу, чтобы мой bg белый, как я его использовал
var navigationBarAppearace = UINavigationBar.appearance() navigationBarAppearace.tintColor = UIColor.lightGrayColor() navigationBarAppearace.barTintColor = UIColor.whiteColor() navigationBarAppearace.clipsToBounds = true navigationBarAppearace.translucent = true navigationBarAppearace.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default) navigationBarAppearace.shadowImage = UIImage()
Ответ 10
С#/решение Xamarin
NavigationController.NavigationBar.SetBackgroundImage(new UIImage(), UIBarMetrics.Default);
NavigationController.NavigationBar.ShadowImage = new UIImage();
NavigationController.NavigationBar.Translucent = true;
Ответ 11
для Swift 3.0:
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController?.navigationBar.isTranslucent = true
}
Ответ 12
Вы имеете в виду полностью прозрачную или используя прозрачно-черный стиль, видимый в приложении "Фотографии"? Последнее вы можете выполнить, установив для свойства barStyle
значение UIBarStyleBlackTranslucent
. Первый... Я не уверен. Если вы хотите, чтобы элементы на нем все еще были видны, вам может понадобиться выполнить некоторую копанию в иерархии представлений бара и удалить представление, содержащее его фон.
Ответ 13
Другой способ, который работал у меня, - это подкласс 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
}}
Ответ 14
Это работает для Swift 2.0.
navigationController!.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
navigationController!.navigationBar.shadowImage = UIImage()
navigationController!.navigationBar.translucent = true