Темна тінь на навігаційній панелі під час переходу до другої версії після оновлення до Xcode 5.1 та iOS 7.1


91

Коли я переходжу між батьківським та дочірнім контролерами в контролері навігації з деталями, я бачу темну тінь праворуч на панелі навігації вгорі. Це почалося після того, як я перейшов на Xcode 5.1. Це відчуває себе грубо і відволікаюче. Як я можу від цього позбутися?

Відповіді:


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

Я вирішив цю проблему, встановивши колір тла подання контролера навігації.


Ця відповідь насправді дуже хороша. З якихось причин Interface Builder не дозволяє отримати доступ до подання вашого контролера навігації, але схоже на darkColorте, що представлення все ще є і спричиняє цю проблему.
superarts.org

1
Це чудова відповідь, оскільки вона також дозволяє смузі залишатися напівпрозорою, не відображаючи потворний чорний ділянку, що просочується через навігаційний контролер. Тільки хотілося б, щоб був спосіб це встановити в розкадруванні.
dimiguel

Точно так. Час від часу я замислююся над цим і трохи розчаровуюсь з приводу інших відповідей, які пропонують вимкнути прозорість панелі навігації, оскільки в основному вони вирішують цю проблему, вимкнувши функцію, яка в цій відповіді вказує на фактичне виправлення. Шкода, що така поведінка залишається незмінною в Xcode 7 / iOS 9.
superarts.org

1
На жаль, я підтримав цю відповідь, оскільки фон вікна не є першопричиною цієї проблеми. Будь ласка, перегляньте мій скріншот, що додається: imgur.com/a/SH5Dp Ви виявите, що проблема все ще існує, темний відтінок просто замінений на білий, я думаю, контролер деталей "обрізаний" або якось, зробіть, щоб він нічого не намалював під NavBar .
mariotaku

1
tabBarController? .view.backgroundColor = UIColor.white у випадку, якщо кореневим контролером є UITabBarController.
Vishal Singh

55
self.navigationController.navigationBar.translucent = NO; 

це виправили


Де ви це розмістили?
Zorayr

У методі ViewDidLoad головного контролера перегляду
Ніхат

add in viewDidAppear
Абдул Вахід

я думаю, це насправді правильна відповідь. це navigationController.view.backgroundColor = .whiteвже не працює на iOS 11.
AnBisw,

1
@Annjawn, navigationController.view.backgroundColor = .whiteпрацює на iOS 12. Видалення напівпрозорого з панелі навігації не можна використовувати в ситуації, коли це потрібно, але чорна тінь - ні.
Alex Motor

38

Відповідь nonamelive ідеальна. Щоб домогтися того ж самого у Interface Builder І ЩО ЗБЕРЕГТИ ТРАНСЛЮЦЕНТНІСТЬ , виберіть контролер навігації та встановіть визначений користувачем атрибут часу виконання, view.backgroundColorяк показано на скріншоті (в Інспекторі ідентичності). Повторіть для всіх контролерів навігації, які показують цю проблему.

Здається, вся ця проблема виникає через те, що чорний колір (або насправді ніякого кольору) UINavigationController просочується в той момент, коли CoreGraphics робить його знімки на початку анімації. Отже, встановлення білого кольору це запобіжить.

Інспектор посвідчень -> Визначені користувачем атрибути виконання


1
Я віддаю перевагу такому підходу, дозвольте Interface Builder максимально наповнювати інтерфейс.
DazChong

iOS 8.4 не допоміг
Максим Князєв

3
Чудово працює з Xcode 8.3.3. Просто для повторного підкреслення потрібно UINavigationControllerввімкнути, а не на viewController.
jungledev

Я мав навікон у tabcon і бачив тіні на обох смугах (зверху та знизу), коли використовував "Приховує нижню панель при натисканні" на одному з VC навігації. Встановлення білого тла на навікторі зафіксувало обидві тіні. Дякую!
nh32rg

6

Здається, це помилка, яку було представлено в iOS 7.1. У моєму випадку це викликано панеллю UITool, розміщеною безпосередньо під панеллю навігації. Темна тінь також відображається на напівпрозорій панелі вкладок.

Здається, тінь спричинена фоновим видом панелі UITool. Тепер я використовую цей обхідний шлях у контролері подання з панеллю інструментів, яка приховує фоновий вигляд панелі інструментів під час переходу:

- (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


2
Ваше рішення буде чудовим, якщо ви не хочете напівпрозору панель навігації.
том

Існує простіший спосіб отримати backgroundView. [self.toolbar valueForKey:@"_backgroundView"]. Зверніть увагу, це приватний API, але я думаю, що Apple вас не спіймає, оскільки _backgroundViewце лише загальне ім’я.
nonamelive

Ця відповідь підказала мені, що мені потрібно було зробити. У моєму випадку це було так просто, як зняти прапорець з напівпрозорого варіанту на панелі UITool у конструкторі інтерфейсів.
Greg W

4

Здається, це трапляється з будь-якою напівпрозорою панеллю (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


Мені вдалося вирішити цю проблему, прийнявши рішення @ manmal - визначити атрибут виконання view.backgroundColorдля вашого UITabBarController у розкадровці та встановити для нього білий колір.
jamesk

4

Це працює у мене в Swift

У методі AppDelegateon didFinishLaunchingWithOptionsя встановив це:

UIApplication.shared.windows.first?.backgroundColor = .white

4

Це працює для мене на iOS 13 зі світлою та темною темами, а також на старих версіях iOS.

Додайте наступний код до AppDelegate до application(didFinishLaunchingWithOptions)методу:

if #available(iOS 13.0, *) {
    window?.backgroundColor = UIColor.systemBackground
} else {
    window?.backgroundColor = UIColor.white
}

Я теж спробував цей метод, але стикаюся з проблемою, коли представляю контролер перегляду в режимі за замовчуванням. Тоді ви побачите білий фон вікна замість чорного. Це виглядає дивно. чи можете ви запропонувати будь-яку ідею для подолання цієї ситуації
varun v nair

3

Ось мій варіант ... він вимагає набагато менше коду, ніж відповідь Тома, і є більш ефективним. Це ЯКЩО ви хочете напівпрозору панель навігації, а також хочете вирішити цю тіньову проблему.

У вихідному ViewController (який вбудований в Navigation Controller) ...

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

і

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

Результат той самий, що робить Том (візуально для кінцевого користувача), і його легше реалізувати. Сподіваюся, це допомагає ...


3
self.navigationController!.navigationBar.translucent = false;

Це працює для мене, помістіть його всередину функції, куди ви натискаєте новий ViewController


Божевільний, але серед усіх відповідей була ідея розмістити його у функції, що підштовхує до наступного ВК!
Колтуксумаб,

3

Наступне також працює, а панель навігації залишається прозорою:

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


1

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


-1

Або якщо ви використовуєте конструктор інтерфейсів, ви можете просто вибрати панель навігації на своєму контролері навігації та зняти прапорець Прозорий між Стилем та Відтінком панелі в Інспекторі атрибутів, щоб позбутися цього дивного ефекту -

Інспектор

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.