Сделать UINavigationBar прозрачный
Как сделать UINavigationBar прозрачный? Хотя я хочу, чтобы его элементы панели оставались видимыми.
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];
приведенный ниже код расширяется на верхний ответ, выбранный для этой темы, чтобы избавиться от нижней границы и установить цвет текста:
последние две закодированные строки этого кода задают прозрачность. Я взял этот код из этой темы, и он работал отлично!
свойство "clipsToBounds" было кодом, который я нашел, который избавился от нижней границы линии с или без набора прозрачности (так что если вы решите пойти с твердым белым/черным/и т. д. фон вместо этого по-прежнему не будет пограничной линии).
в строке " tintColor "(2-я закодированная строка) установите кнопку "назад" на светло-серый
я сохранил 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()
для 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.