Відповіді:
Якщо когось цікавить, як цього досягти в 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.
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default) self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.translucent = true
В 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];
[[UINavigationBar appearance] setShadowImage: [[UIImage alloc] init]];
Від 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];
-drawRect:
власне підклас, а не категорію, а потім використовувати цей підклас як панель навігації.
Після того, як всі інші сказали вище, тобто:
navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController!.navigationBar.isTranslucent = true
... мій панель навігації був ще білим . Тому я додав цей рядок:
navigationController?.navigationBar.backgroundColor = .clear
... et voila! Це, здавалося, трюк.
Якщо ви будуєте за допомогою останньої бета-версії 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
}
}
}
Я знаю, що ця тема стара, але якщо люди хочуть знати, як це робиться, не перевантажуючи метод 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 як резервну копію. Я не знаю, чому прозорість не спрацює, але якщо цього не відбувається, я хочу, щоб мій біг був білим, як раніше
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()
NavigationController.NavigationBar.SetBackgroundImage(new UIImage(), UIBarMetrics.Default);
NavigationController.NavigationBar.ShadowImage = new UIImage();
NavigationController.NavigationBar.Translucent = true;
Спробуйте наступний фрагмент коду:
self.navigationController.navigationBar.translucent = YES;
Ще один спосіб, який працював для мене, - це підклас 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
}}
У 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
Ви маєте на увазі повністю прозорий або використовуючи напівпрозоро-чорний стиль, помічений у додатку "Фото"? Останнє ви можете досягти, встановивши його barStyle
властивість UIBarStyleBlackTranslucent
. Колишній ... я в цьому не впевнений. Якщо ви хочете, щоб елементи на ньому все-таки були видимими, можливо, вам доведеться прокопати в ієрархії подання панелі та видалити подання, що містить його фон.
Перевірте RRViewControllerExtension , який присвячений управлінню зовнішнім виглядом панелі UINavigation.
з RRViewControllerExtension у вашому проекті вам просто потрібно перекрити
-(BOOL)prefersNavigationBarTransparent;
у вас перегляд контролера.
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)
}
}
}
}
[self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault]; self.navigationController.navigationBar.shadowImage = nil; self.navigationController.navigationBar.translucent = NO;