Почему установка `hidesBottomBarWhenPushed` на YES с полупрозрачной навигационной анимацией break break?

У меня есть то, что я считаю довольно распространенной установкой, но я вижу довольно странную проблему с анимацией.

Storyboard

Там есть контроллер навигации внутри панели вкладок. Если я нажму на этот контроллер навигации, я все еще вижу предыдущий вид viewController red view на панели навигации во время анимации push, но только когда у меня есть hidesBottomBarWhenPushed установлен на yes на целевом viewController (справа). Это уменьшенный пример проблемы, и все это можно настроить в раскадровке.

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

Кто-нибудь решил эту проблему? Я делаю что-то неподдерживаемое? Это ошибка? Я определенно хочу держать полупрозрачные полосы и скрывать панель вкладок при нажатии, но я открыт для способов надежно скрывать панель вкладок каким-то другим способом, который поддерживает полупрозрачные панели вкладок.

Animation

Ответ 1

Вот что я нашел до сих пор:

# 1 Верхняя правая панель черная

Размытая черная часть в верхнем правом углу верхней панели - это UIWindow за просвечивающим UINavigationbar, с backgroundColor по умолчанию blackColor.

Снимок экрана демонстрирует это, установив для фона толкаемого изображения значение clearColor.

enter image description here

В качестве обходного пути установка свойства UIWindow backgroundColor в нужный цвет фона устраняет эту проблему, если у вас также есть свойство edgesForExtendedLayout контроллера вида, чтобы установить значение .Top.

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    window?.backgroundColor = UIColor.whiteColor()
    return true
}

class ViewToPushViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.edgesForExtendedLayout = UIRectEdge.Top
        // Or set it from the Attributes Inspector in IB.
        // See screenshot below.
    }
}

Я рассматриваю это обходное решение, так как я считаю, что изменение свойства UIWindow backgroundColor не обязательно то, что нам нужно делать. Возможно, будущая версия iOS может решить эту проблему.

# 2 Просмотр содержимого "движение вниз" после окончания анимации анимации

Если у вас есть subview с нижним макетом и представления "move down", я еще не нашел идеального исправления. Однако установка полосы вкладок в скрытую область помогает в некоторой степени. В качестве предостережения и, как и ожидалось, скрытие панели вкладок также сразу скрывает ее от родительского контроллера представления во время анимации push (хотя во время анимации становится видимым снова во время просмотра).

class ViewToPushViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        // ...

        self.tabBarController?.tabBar.hidden = true
    }
}

Убедитесь, что свойство ViewToPushViewController hidesBottomBarWhenPushed установлено на true до его нажатия (либо в инспекторе атрибутов конструктора интерфейса, либо в методе prepareForSegue в родительском контроллере представления).

enter image description here

Убедитесь, что вы также проверяете поведение анимации при нажатии кнопки "Назад".

Ответ 2

У вас может быть класс UITabBarController, а его фон пуст. и фоновый фон по умолчанию - черный.

в Swift 2

без изменения анатомии приложения:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point ...
    window?.backgroundColor = UIColor.whiteColor()
    return true
}

Ответ 3

Я настраиваю свою раскадровку, как вы показывали с теми же сегментами и т.д., и получал ту же странную анимацию. Осмотрев резолюцию и играя с кодом, я добрался до этого.

Используйте это в контроллере представления назначения, надеюсь, что это поможет.

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self hideTabBar];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    [self showTabBar];
}

- (void)hideTabBar
{
    UITabBar *tabBar = self.tabBarController.tabBar;
    UIView *parent = tabBar.superview;
    UIView *content = [parent.subviews objectAtIndex:0];
    UIView *window = parent.superview;

    [UIView animateWithDuration:0.5
                     animations:^{
                         CGRect tabFrame = tabBar.frame;
                         tabFrame.origin.y = CGRectGetMaxY(window.bounds);
                         tabBar.frame = tabFrame;
                         content.frame = window.bounds;
                     }];
}

- (void)showTabBar
{
    UITabBar *tabBar = self.tabBarController.tabBar;
    UIView *parent = tabBar.superview;
    UIView *content = [parent.subviews objectAtIndex:0];
    UIView *window = parent.superview;

    [UIView animateWithDuration:0.5
                     animations:^{
                         CGRect tabFrame = tabBar.frame;
                         tabFrame.origin.y = CGRectGetMaxY(window.bounds) - CGRectGetHeight(tabBar.frame);
                         tabBar.frame = tabFrame;

                         CGRect contentFrame = content.frame;
                         contentFrame.size.height -= tabFrame.size.height;
                     }];
}

P.s. Как вы сделали этот очень классный gif, пригодится.

Ответ 4

Просто установите цвет фона окна и вид панели навигации в приложении: didFinishLaunchingWithOptions:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window.backgroundColor = [UIColor whiteColor];
    [UINavigationBar appearance].translucent = NO;
    return YES;
}

Ответ 5

Установить представление UITabBarController backgroundColor может работать

Ответ 6

Я нашел ответ с Objective-C! даже если он подходит для вашей ситуации!

AnotherViewController *av = [[AnotherViewController alloc] init];

//Установить цвет представления контроллера

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

[self setHidesBottomBarWhenPushed:YES];

[self.navigationController pushViewController:av animated:YES];

если вы измените цвет представления на определенный цвет (красный, синий...), вы узнаете, как этот код работает ~