Ответ 1
self.navigationController.navigationBar.translucent = NO;
зафиксировал его
Когда я перемещаюсь назад и вперед между родительским и дочерним контроллерами в контроллере навигации главной детали, я вижу темную тень с правой стороны панели навигации сверху. Он начался после обновления до Xcode 5.1. Это грустно и отвлекает. Как я могу избавиться от него?
self.navigationController.navigationBar.translucent = NO;
зафиксировал его
self.navigationController.view.backgroundColor = [UIColor whiteColor];
Я решил эту проблему, установив цвет фона в виде навигационного контроллера.
Неамолептивный ответ - совершенный. Для достижения такого же результата в интерфейсе Builder И STILL KEEP TRANSLUCENCY выберите контроллер навигации и установите пользовательский атрибут времени выполнения view.backgroundColor
, как показано на скриншоте (в Identity Inspector). Повторите для всех контроллеров навигации, которые показывают эту проблему.
Кажется, что вся эта проблема возникает из-за того, что черный цвет (или фактически, без цвета) UINavigationController протекает в момент создания моментальных снимков CoreGraphics, которые он запускает при анимации. Таким образом, установка белого цвета предотвратит это.
Кажется, это ошибка, которая была введена в 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
Кажется, что это происходит с любым баром (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 не исправит это поведение, поскольку в некоторых случаях бары ARE должны быть скрыты, в отличие от того, что было предложено в других сообщениях, особенно для UITabBar
Вот моя вариация... для этого требуется гораздо меньше кода, чем тот, и более эффективен. Это если вы хотите полупрозрачную навигационную панель, а также хотите исправить эту проблему с тенью.
В исходном ViewController (встроенном в контроллер навигации)...
- (void)viewDidAppear:(BOOL)animated
{
self.navigationController.navigationBar.translucent = YES;
}
и
- (void)viewWillDisappear:(BOOL)animated
{
self.navigationController.navigationBar.translucent = NO;
}
Результат такой же, как то, что делает Tom (визуально, конечному пользователю), и его проще реализовать. Надеюсь, это поможет...
Хотя это не то же самое, что и реализация 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
.
Следующее также работает и оставляет прозрачную панель навигации:
[UIApplication sharedApplication].keyWindow.backgroundColor = [UIColor whiteColor];
self.navigationController!.navigationBar.translucent = false;
Это работает для меня, чтобы разместить его внутри функции, где вы нажимаете новый ViewController
Или, если вы используете построитель интерфейсов, вы можете просто выбрать панель навигации из своего навигационного контроллера и снять флажок "Прозрачный" между стилем и штрих-кодом в инспекторе атрибутов, чтобы избавиться от этого странного эффекта -