2015-02-25 1 views
36

(упрощенно) структура моего приложения заключается в следующем:Auto Layout и «Скрыть нижнюю панель при нажатии»

UITabBarController одним UINavigationController проведение UITableViewController в качестве контроллера вида корень.

при нажатии одной из ячеек контроллера таблицы я нажимаю обычный UIViewController (позволяет называть его VC), закрывая нижнюю панель вкладок. (с помощью флага «Скрыть нижнюю планку при нажатии»)

В раскадровке я добавил обычный подкласс UIView в VC, который выглядит как нижняя панель, и я использую Auto Layout, чтобы прикрепить его к нижней части окна VC.

Проблема
когда я нажимаю VC она занимает второе место по этой точке зрения, чтобы прикрепить к нижней части, он выглядит Автокомпоновку придавить его на дно, как если панель не скрыта и после того, как на секунду он что панель вкладок скрыта и перемещает ее в реальное дно представления.

Я знаю, что это не лучшее объяснение, поэтому я добавил very simple project, чтобы продемонстрировать эту проблему.

+0

Я думаю, что вы не используете свойство hidesBottomBarWhenPushed по-своему (посмотрите на этот метод в документах). Предполагается, что он скрывает панель инструментов, которую может присутствовать навигационный контроллер, а не панель вкладок. – rdelmar

+1

привет @rdelmar, так что же такое способ скрыть панель вкладок при нажатии? это должно быть очень распространенным я считаю. – Eyal

ответ

61

Проблема заключается в этом конкретном ограничении, которое находится между видом и верхней частью нижней схемы макета.

enter image description here

Выберите ограничение и редактировать его свойство "Второй пункт"

enter image description here

Здесь вам нужно выбрать нижний

enter image description here

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

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

+2

Это простейшее решение. Я пробовал это сам. –

+0

спасибо, приятно и чисто :) – Eyal

+1

Когда автозапуск не будет работать http://stackoverflow.com/questions/29334285/replacing-tabbar-with-toolbar-in-storyboard/30283470#30283496 – DogCoffee

11

Привет В раскадровке выберите панель вкладок (это вкладка «Панель управления вкладками»> «Панель управления вкладками»> «Панель вкладок»), в инспекторе атрибутов снимите флажок «Прозрачный». Это действие устранит вашу проблему. (Но есть много вещей, «Скрыть нижнюю панель при нажатии» - это панель инструментов).

+0

, но теперь панель вкладок видна, когда я нажимаю VC, мне нужно, чтобы она была скрыта. – Eyal

+0

По крайней мере, в примере проекта, который вы разделили (AutoLayoutTest), если вы только снимите прозрачное свойство в панели вкладок, панель вкладок исчезнет, ​​когда вы нажмете, и фиолетовый вид появится на своем месте.(Испытайте свой проект) –

+0

работал для меня, но я ищу любую будущую ошибку, которую это может вызвать. –

2

Если вы хотите, чтобы панель вкладок будет скрыта, вы можете добавить этот код в контроллер,

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    self.tabBarController.tabBar.hidden = YES; 
} 

Вы также должны поставить этот код (но прохождение NO) в контроллер, где вы хотите панель вкладок должна быть видимой. Вы также должны снять флажок «Скрыть нижнюю планку при нажатии» в IB.

После Edit:

Вы получите лучшую анимацию, если в первом контроллере, анимировать альфа-значение, не скрытая панель вкладок от 0 до 1 в течение короткого промежутка времени. Это выглядит хорошо, если вы вернетесь с помощью кнопки «Назад». Если вы хотите использовать салфетки назад, вам нужно будет сделать что-то более сложное с помощью interactivePopGestureRecognizer.

-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    self.tabBarController.tabBar.hidden = NO; 
    self.tabBarController.tabBar.alpha = 0.0; 
    [UIView animateWithDuration:.4 animations:^{ 
     self.tabBarController.tabBar.alpha = 1.0; 
    }]; 
} 
+0

проблема с этим решением заключается в том, что вы видите исчезновение/появление панели вкладок. особенно при использовании жестов салфетки назад. – Eyal

+0

@ Эйял, я отредактировал свой ответ, чтобы показать способы улучшения анимации. – rdelmar

+0

им не удобно с таким решением, скрывая/показывая панель вкладок на viewWillAppear/viewWillDisapear немного рискованно, я думаю. кажется, что «скрыть нижнюю панель» отлично работает без автоматической компоновки, поэтому я задаюсь вопросом, что-то связано с конфигурацией автоматического макета. – Eyal

0

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

1
-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    self.tabBarController.tabBar.hidden = NO; 
    self.tabBarController.tabBar.alpha = 0.0; 
    [UIView animateWithDuration:.3 animations:^{ 
     self.tabBarController.tabBar.alpha = 5.0; 
    }]; 
} 
1

набор UINavigationBar полупрозрачный с NO.

так: self.navigationController.navigationBar.translucent = NO;

5

Выберите «Navigation Controller» и «Атрибут Инспектор» снимите галочку с «Под Bottom Барс».

1

В раскадровке Перейти к View Controller, который вы хотите, чтобы скрыть панель вкладок, нажмите на Attribute Inspector и выберите Скрыть нижнюю панель при нажатии. Проверьте изображение ниже.

storyboard example

32

Принятый ответ не работает для меня (опция не доступна). Однако я нашел другое решение. (на основе Hide Bottom Bar When Pushed through Autolayout)

Выберите стенд для просмотра и объекта для выравнивания (в моем случае btnShare) и добавьте новое выравнивание (нижние края).

enter image description here enter image description here

+3

Спасибо. Это работает для меня! – casamia

+2

Отлично! Это сработало и для меня! –

+1

Отлично! Это должен быть принятый ответ! –

6

Если вы не можете выбрать bottomlayoutguide дно в вашем Xcode 7+

like there просто сделать следующее: открыть раскадровку в редакторе исходного кода

open in editor поиска ваш идентификатор вашего контроллера

search in source file найти <layoutGuides>, тип <bottom>, скопируйте его идентификатор

find layoutGuides поиска по атрибутам изменений идентификатора сверху донизу

find and replace наслаждаться.

+0

Это сработало! Спасибо! –

Смежные вопросы