Подтвердить что ты не робот

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, чтобы отключить полупрозрачность один за другим, но должно быть более элегантное решение этой проблемы...

4b9b3361

Ответ 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 на НЕ полупрозрачный и задайте цвет не четким цветом.