Был опубликован аналогичный вопрос (https://stackoverflow.com/questions/16773312/facebook-like-navigationbar), к сожалению, он был закрыт довольно быстро. Я выкупаю его намеченную славу здесь.
Вы можете легко получить постоянную панель навигации, еслиВы рассматриваете навигацию в терминах приложения на основе вкладок (со скрытыми вкладками).
Использование раскадровок:
![Simple setup in Storyboard](https://i.stack.imgur.com/CWput.png)
- Создание нового UINavigationController (Nav1).
- Установите UITabController в качестве корневого контроллера представления Nav 1. (Панель вкладок) Обратите внимание, что у него будет собственная навигационная панель (я пометил ее как «Persistent Nav Bar»).
- Создайте еще один UINavigationController (Nav 2).
- Установите выбранный контроллер представления (My View Controller) в качестве корневого контроллера представления Nav 2.
Установите Nav 2 какпервый контроллер представления (вкладки) контроллера панели вкладок.
Для Nav 1: в Инспекторе атрибутов -> Контроллер навигации -> Видимость панели, убедитесь, что поле имеет значение помечено (чтобы оно показывалоs Панель навигации).
- Для Nav 2: в Инспекторе атрибутов -> Контроллер навигации -> Видимость панели, убедитесь, что для поля не отмечен (чтобы он выигралне показывать панель навигации).
Если вы запустите приложение, вы должны увидеть видимый заголовок панели вкладок и скрытый заголовок вашего контроллера представления.Это дает вам основы постоянной навигационной панели.Вы можете сохранить PUSHing представления в стеке из My View Controller, и он останется постоянным.Представление MODAL открывает новый контекст, поэтому постоянство теряется.Если вы повторите эти шаги, вы сможете создать тот же эффект и для модально представленных представлений.
Остальная часть этого ответа касается скрытия панели вкладок и управления элементами панели навигации.
Так что это здорово, но как разместить свой пользовательский вид в панели навигации и как скрыть эту панель вкладок?
Создать подкласс изUITabBarController и назначьте его контроллеру панели вкладок в нашей раскадровке.
Скрытие панели вкладок
Вы можете скрыть панель вкладок любым способом.Если вам интересно, подробнее об этом ( Как скрыть uitabbarcontroller );этот небольшой фрагмент адаптирован из моего ответа в этой теме:
CGRect screenRect = [[UIScreen mainScreen] bounds];
float fHeight = screenRect.size.height;
if( UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation) )
{
fHeight = screenRect.size.width;
}
for(UIView *view in self.view.subviews){
if([view isKindOfClass:[UITabBar class]]){
[view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)];
}else{
[view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)];
}
}
Это сместит панель вкладок вне поля зрения и изменит размер представления, чтобы заполнить пространство (без анимации, как если бы ее там никогда не было),Добавьте этот фрагмент в начало viewDidLoad
, чтобы убрать эту полосу.
Пользовательский вид в навигационной панели
В методе viewDidLoad
нашегоПодкласс TB, вы можете создать свой собственный вид с помощью кнопок и добавить его на панель навигации следующим образом: [self.navigationItem setTitleView:myCustomTitleView];
Easy.
Если он не отображается должным образом, убедитесь, что вы определили его кадр, прежде чем установить его в качестве titleView.Затем, добавив его, используйте [myCustomTitleView sizeToFit]
, чтобы он был прилегающим к панели навигации.
Настройка элементов панели кнопок
Настройка элементов панели слева и справатребуется небольшое изменение в обозначениях.Обычно вы устанавливаете левую кнопку на панели, ссылаясь на self.navigationItem.leftBarButtonItem
.Эта ссылка фактически указывает на левую кнопку панели скрытой панели навигации.Чтобы получить доступ к навигационной панели VISIBLE, используйте self.tabBarController.navigationItem.leftBarButtonItem
.Легко!
Обработка элемента кнопки возврата утерянной панели
Одна вещь, которой вы жертвуете с помощью постоянной навигационной панели, - это управление перемещенными представлениями.Такие вещи, как стрелка назад, не будут отображаться (они отображаются на скрытой панели навигации).Вы можете преодолеть это, установив свой подкласс TabBarController в качестве делегата для своих контроллеров представления (которые все должны быть UINavigationControllers).
for (UINavigationController *navController in self.viewControllers) {
navController.delegate = self;
}
Всякий раз, когда любой из этих UINavigationControllers выдвигает другое представление, вы можете перехватить это действие с этим делегатомМетод:
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
Здесь вы можете проверить, сколько контроллеров представления выдвигается:
if(navigationController.viewControllers.count > 1){
//create a custom back button here and add it to the nav bar
}else{
//set the left bar button (where the custom back button would sit) to nil
}
Пользовательская кнопка возврата может вызывать метод в вашем подклассе контроллера панели вкладок, который сообщает текущему выбранному контроллеру представления, чтобы выскочить его текущее представление.
Это то, как Facebook это сделал?
Я не могу подтвердить, что так Facebook это сделал (вероятно, нет), но он достигнет аналогичногоэффект.Я эффективно использовал его в своем последнем приложении (http://www.waterboyapp.com),, которое было с радостью принято Apple без промедления. Я хотел бы, чтобы кто-то опубликовал это раньше, поэтому мой вклад здесь поможет сэкономить часы / дни поиска.
В сторону
Дополнительный бонус к этой реализации (кроме простоты и элегантности) заключается в том, что вы можете связать несколько контроллеров представления с панелью вкладок.немного творчества, вы можете воссоздать пользовательские кнопки на панели навигации (на основе вкладок), которые выполняют ту же функцию, что и панель вкладок.Это экономит место на экране (поскольку панели вкладок довольно большие) и по-прежнему использует панель вкладок для выполненияваш обмен местами.