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

Темная тень на панели навигации во время перехода segue после обновления до Xcode 5.1 и iOS 7.1

Когда я перемещаюсь назад и вперед между родительским и дочерним контроллерами в контроллере навигации главной детали, я вижу темную тень с правой стороны панели навигации сверху. Он начался после обновления до Xcode 5.1. Это грустно и отвлекает. Как я могу избавиться от него?

4b9b3361

Ответ 1

self.navigationController.navigationBar.translucent = NO; 

зафиксировал его

Ответ 2

self.navigationController.view.backgroundColor = [UIColor whiteColor];

Я решил эту проблему, установив цвет фона в виде навигационного контроллера.

Ответ 3

Неамолептивный ответ - совершенный. Для достижения такого же результата в интерфейсе Builder И STILL KEEP TRANSLUCENCY выберите контроллер навигации и установите пользовательский атрибут времени выполнения view.backgroundColor, как показано на скриншоте (в Identity Inspector). Повторите для всех контроллеров навигации, которые показывают эту проблему.

Кажется, что вся эта проблема возникает из-за того, что черный цвет (или фактически, без цвета) UINavigationController протекает в момент создания моментальных снимков CoreGraphics, которые он запускает при анимации. Таким образом, установка белого цвета предотвратит это.

Identity Inspector - > Пользовательские атрибуты времени выполнения

Ответ 4

Кажется, это ошибка, которая была введена в 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

Ответ 5

Кажется, что это происходит с любым баром (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

Ответ 6

Вот моя вариация... для этого требуется гораздо меньше кода, чем тот, и более эффективен. Это если вы хотите полупрозрачную навигационную панель, а также хотите исправить эту проблему с тенью.

В исходном ViewController (встроенном в контроллер навигации)...

- (void)viewDidAppear:(BOOL)animated
{
     self.navigationController.navigationBar.translucent = YES;
}

и

 - (void)viewWillDisappear:(BOOL)animated
 {
     self.navigationController.navigationBar.translucent = NO;
 }

Результат такой же, как то, что делает Tom (визуально, конечному пользователю), и его проще реализовать. Надеюсь, это поможет...

Ответ 7

Хотя это не то же самое, что и реализация 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.

Ответ 8

Следующее также работает и оставляет прозрачную панель навигации:

[UIApplication sharedApplication].keyWindow.backgroundColor = [UIColor whiteColor];

Ответ 9

self.navigationController!.navigationBar.translucent = false;

Это работает для меня, чтобы разместить его внутри функции, где вы нажимаете новый ViewController

Ответ 10

Или, если вы используете построитель интерфейсов, вы можете просто выбрать панель навигации из своего навигационного контроллера и снять флажок "Прозрачный" между стилем и штрих-кодом в инспекторе атрибутов, чтобы избавиться от этого странного эффекта -

Inspector