Когда я перемещаюсь между родительским и дочерним контроллерами в главном контроллере навигации, я вижу темную тень с правой стороны панели навигации вверху. Это началось после того, как я обновился до Xcode 5.1. Это грубо и отвлекает. Как мне от этого избавиться?
92
darkColor
представление все еще существует, и вызывает эту проблему.self.navigationController.navigationBar.translucent = NO;
Для новых версий Swift:
navigationController?.navigationBar.isTranslucent = false
источник
navigationController.view.backgroundColor = .white
больше не работает на прошивке 11.navigationController.view.backgroundColor = .white
работает на iOS 12. Удаление полупрозрачного с панели навигации не может использоваться в ситуации, когда это необходимо, а черная тень - нет.ответ nonamelive идеален. Чтобы добиться того же в Интерфейсном Разработчике И ЕЩЕ СОХРАНИТЬ ПРОЗРАЧНОСТЬ , выберите контроллер навигации и установите определяемый пользователем атрибут времени выполнения,
view.backgroundColor
как показано на снимке экрана (в Инспекторе идентичности). Повторите эти действия для всех контроллеров навигации, которые обнаруживают эту проблему.Похоже, что вся эта проблема возникает из-за того, что черный цвет (или на самом деле без цвета) UINavigationController просачивается в то время, когда CoreGraphics делает снимки в начале анимации. Таким образом, установка белого цвета предотвратит это.
источник
UINavigationController
включен, а не на viewController.Похоже, это ошибка, появившаяся в iOS 7.1. В моем случае это вызвано расположением UIToolbar непосредственно под панелью навигации. Темная тень также появляется на полупрозрачной панели вкладок.
Тень, похоже, вызвана фоновым изображением UIToolbar. Теперь я использую этот обходной путь в контроллере представления с панелью инструментов, которая скрывает фоновое представление панели инструментов во время перехода:
- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; UIView *toolbarBackgroundView = [self.toolbar findViewRecursively:^BOOL(UIView *subview, BOOL *stop) { BOOL isToolbarBackgroundView = ([subview isKindOfClass:[UIImageView class]] && [NSStringFromClass(subview.class) isEqualToString:@"_UIToolbarBackground"]); if (isToolbarBackgroundView) { *stop = YES; } return (! isToolbarBackgroundView); }]; if (toolbarBackgroundView) { // fade toolbar background view back in [UIView animateWithDuration:0.1f animations:^{ toolbarBackgroundView.alpha = 1.0f; }]; } } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; UIView *toolbarBackgroundView = [self.toolbar findViewRecursively:^BOOL(UIView *subview, BOOL *stop) { BOOL isToolbarBackgroundView = ([subview isKindOfClass:[UIImageView class]] && [NSStringFromClass(subview.class) isEqualToString:@"_UIToolbarBackground"]); if (isToolbarBackgroundView) { *stop = YES; } return (! isToolbarBackgroundView); }]; if (toolbarBackgroundView) { // hide toolbar background view toolbarBackgroundView.alpha = 0.0f; } }
Это код для
[UIView findViewRecursively:]
@interface UIView (FindSubview) - (UIView*)findViewRecursively:(BOOL(^)(UIView* subview, BOOL* stop))recurse; @end @implementation UIView (FindSubview) - (UIView*)findViewRecursively:(BOOL(^)(UIView* subview, BOOL* stop))recurse { for (UIView* subview in self.subviews) { BOOL stop = NO; if (recurse(subview, &stop)) { UIView* view = [subview findViewRecursively:recurse]; if (view) return view; } else if (stop) { return subview; } } return nil; } @end
Я подал этот радар: http://openradar.appspot.com/16418845
источник
backgroundView
.[self.toolbar valueForKey:@"_backgroundView"]
. Обратите внимание, что это частный API, но я думаю, что Apple вас не поймает, потому что_backgroundView
это просто общее имя.Кажется, это происходит с любой полупрозрачной панелью (TabBar или ToolBar).
Итак, один из способов исправить это - установить
_tabBar.translucent = NO;
(в моем случае). Это предотвращает нежелательную тень под верхней панелью навигации, оставляя панель навигации полупрозрачной. К сожалению, нижняя полоса больше не полупрозрачна.Его можно снова сделать полупрозрачным, но все это должно произойти после завершения всей анимации нажатия, поэтому переключение этого свойства хорошо заметно.
Однако в случае, если нижняя панель также должна быть полупрозрачной, и я не хочу, чтобы пользователь видел изменение, я решил это следующим образом:
/* create a simple quick animation of the bottom bar just before pushing the new controller */ [UIView animateWithDuration:0.1 animations:^{ _tabBar.barTintColor = [UIColor colorWithWhite:0.97254901960784 alpha:1.0]; // this is the closest color for my case _tabBar.translucent = NO; } completion:^(BOOL finished) { /* now when the animation that makes the bar not translucent is finished we can push the new controller the controller is instantiated before the animation code */ [self.navigationController pushViewController:controller animated:YES]; }];
Затем
viewDidAppear:
я просто возвращаю это обратно:[UIView animateWithDuration:0.1 animations:^{ _tabBar.barTintColor = nil; _tabBar.translucent = YES; }];
Во внешнем виде есть небольшое изменение, но оно едва заметно, и это лучше, чем тень под панелью навигации.
Надеюсь, что это поможет другим сохранить полупрозрачность полос, пока Apple не исправит это поведение, поскольку в некоторых случаях полосы ПРЕДНАЗНАЧЕНЫ для скрытия, в отличие от того, что предлагалось в других сообщениях, особенно для
UITabBar
источник
view.backgroundColor
для вашего UITabBarController в раскадровке и установив для него белый цвет.Это работает для меня в Swift
В
AppDelegate
наdidFinishLaunchingWithOptions
методе, я установил следующее:UIApplication.shared.windows.first?.backgroundColor = .white
источник
У меня это работает на iOS 13 как со светлой, так и с темной темами, а также со старыми версиями iOS.
Добавьте в
application(didFinishLaunchingWithOptions)
метод AppDelegate следующий код :if #available(iOS 13.0, *) { window?.backgroundColor = UIColor.systemBackground } else { window?.backgroundColor = UIColor.white }
источник
Вот мой вариант ... он требует гораздо меньше кода, чем ответ Тома, и более эффективен. Это ЕСЛИ вам нужна полупрозрачная панель навигации, а также вы хотите исправить эту проблему с тенями.
В исходном ViewController (который встроен в контроллер навигации) ...
- (void)viewDidAppear:(BOOL)animated { self.navigationController.navigationBar.translucent = YES; }
а также
- (void)viewWillDisappear:(BOOL)animated { self.navigationController.navigationBar.translucent = NO; }
Результат такой же, как у Тома (визуально для конечного пользователя), и его проще реализовать. Надеюсь это поможет...
источник
self.navigationController!.navigationBar.translucent = false;
Это работает для меня, поместите его внутри функции, в которой вы нажимаете новый ViewController
источник
Следующее также работает и оставляет панель навигации прозрачной:
[UIApplication sharedApplication].keyWindow.backgroundColor = [UIColor whiteColor];
источник
Хотя это не то же самое, что стандартная реализация iOS, это хороший способ решить проблему:
- (void)viewWillAppear:(BOOL)animated { [UIView animateWithDuration:0.35f animations:^{ self.tabBarController.tabBar.alpha = 1.0f; }]; } - (void)viewWillDisappear:(BOOL)animated { [UIView animateWithDuration:0.35f animations:^{ self.tabBarController.tabBar.alpha = 0.0f; }]; }
Вы получите красивую анимацию нарастания / исчезновения панели вкладок. Добавьте код в корень
UIViewController
.источник
Или, если вы используете конструктор интерфейса, вы можете просто выбрать панель навигации на своем контроллере навигации и снять флажок полупрозрачный между стилем и оттенком полосы в инспекторе атрибутов, чтобы избавиться от этого странного эффекта -
источник