IOS 7: отключить UINavigationBar прозрачность для всего приложения
Есть ли способ отключить прозрачность UINavigationBar для всего приложения?
Я знаю, что использование [self.navigationController.navigationBar setTranslucent:NO]
может устранить эту проблему для одного контроллера, но у меня в моем приложении много UINavigationBars, и это довольно утомительное решение.
Я пробовал [[UINavigationBar appearance] setTranslucent:NO]
, но эта функциональность на удивление не поддерживается. Это приводит к Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** Illegal property type, c for appearance setter, _installAppearanceSwizzlesForSetter:'
Если у меня есть, я могу пройти через все настройки приложения UINavigationBars, чтобы отключить полупрозрачность один за другим, но должно быть более элегантное решение этой проблемы...
Ответы
Ответ 1
если вы установите прозрачность первой панели навигации в стеке на false
[self.navigationController.navigationBar setTranslucent:NO]
, она будет отображаться во всех следующих навигационных элементах навигации, которые будут перенесены в этот стек.
Ответ 2
Вот решение Swift, если вы хотите применить этот стиль для всего приложения.
в классе AppDelegate
добавьте это в didFinishLaunchingWithOptions
:
Для Swift 2:
UINavigationBar.appearance().translucent = false
Для Swift 3:
UINavigationBar.appearance().isTranslucent = false
Ответ 3
Кажется, очень просто с этим кодом в appDelegate
didFinishLaunchingWithOptions
(отлично работает с версиями iOS 8 и выше)
[[UINavigationBar appearance] setTranslucent:NO];
Ответ 4
Я думаю, что вы правы в отношении отсутствия видимости для этого свойства. Используете ли вы объекты UINavigationControllers или UINavigationBar? Если вы используете UINavigationBars, вы можете подклассифицировать его и создать непрозрачную навигационную панель.
Заголовочный файл:
#import <UIKit/UIKit.h>
@interface ABCNonTranslucentNavBar : UINavigationBar
@end
Файл реализации:
#import "ABCNonTranslucentNavBar.h"
@implementation ABCNonTranslucentNavBar
- (void)drawRect:(CGRect)rect
{
[self setTranslucent:NO];
}
Затем просто замените UINavigationBars на ваш подкласс. Вы также можете сделать что-то подобное с подклассом UINavigationController.
Ответ 5
Добавление этого в случае, если кто-то еще сражается с этим.
Вы можете обмануть его, указав не существующее изображение, которое сделает навигационную панель, ВКЛЮЧАЯ ее панель инструментов, непрозрачной
[[UIToolbar appearance] setBackgroundColor:[UIColor colorWithRed:219.0/255.0 green:67.0/255.0 blue:67.0/255.0 alpha:1.0]];
[[UIToolbar appearance] setBackgroundImage:[[UIImage alloc] init] forToolbarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault];
Ответ 6
Я знаю, что это старо, но это может пригодиться кому-то;
Вы можете использовать категорию, и внутри нее * установить свойство [translucent][1]
@implementation UINavigationBar (MakeTranslucent)
-(void)willMoveToWindow:(UIWindow *)newWindow {
[super willMoveToWindow:newWindow];
self.translucent = NO;
}
@end
- Я использовал willMoveToWindow, я не знаю, является ли это хорошей идеей, поэтому UAYOR.
Ответ 7
Я думаю, что внешний вид api не поддерживает полупрозрачное свойство панели навигации.
Но вы можете сделать это для всего приложения, как это, пожалуйста, посмотрите на этот код -
здесь Экран меню представляет собой контроллер корневого представления.
MenuScreen *ms = [[MenuScreen alloc]initWithNibName:@"MenuScreen" bundle:nil];
UINavigationController *nv = [[UINavigationController alloc]initWithRootViewController:ms];
//This will set property for whole App.
[nv.navigationBar setTranslucent:NO];
self.window.rootViewController = nv ;
Ответ 8
Если вы не используете раскадровку, но IB, настройте стиль навигационной панели вашего MainWindows.xib на НЕ полупрозрачный и задайте цвет не четким цветом.