Ответы:
Если кому-то интересно, как этого добиться в 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.
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
... и вуаля! Это, казалось, сделало трюк.
Если вы соберете последнюю бета-версию 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 в качестве резервной копии. Я не знаю, почему прозрачность не будет работать, но если это не так, я хочу, чтобы мой 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()
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
}}
В 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
Вы имеете в виду полностью прозрачный или использующий полупрозрачно-черный стиль, который можно увидеть в приложении Photos? Последнее вы можете сделать, установив его barStyle
свойство в UIBarStyleBlackTranslucent
. Бывший ... я не уверен в этом. Если вы хотите, чтобы элементы на нем все еще были видны, вам, возможно, придется покопаться в иерархии представлений панели и удалить представление, содержащее его фон.
Проверьте RRViewControllerExtension , которое предназначено для управления внешним видом UINavigation bar.
с RRViewControllerExtension в вашем проекте, вам просто нужно переопределить
-(BOOL)prefersNavigationBarTransparent;
у вас viewcontroller.
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;