Кто-нибудь знает способ изменить текст (и внешний вид?) кнопки, возвращаемой делегатом UISplitViewController:
func displayModeButtonItem() -> UIBarButtonItem?
Кто-нибудь знает способ изменить текст (и внешний вид?) кнопки, возвращаемой делегатом UISplitViewController:
func displayModeButtonItem() -> UIBarButtonItem?
Я решил это для себя таким образом:
UIBarButtonItem(image: UIImage(named:"home"),
landscapeImagePhone: UIImage(named:"home"),
style: UIBarButtonItemStyle.Plain,
target: splitViewController.displayModeButtonItem().target,
action: splitViewController.displayModeButtonItem().action)
Я использую это в AppDelegate вместо splitViewController.displayModeButtonItem()
, и он отлично работает для меня.
Я сделал комбинацию решений josh и voluntas88 на моем решении.
Сначала вам нужно использовать метод UISplitViewControllerDelegate
func targetDisplayModeForActionInSplitViewController(_ svc: UISplitViewController) -> UISplitViewControllerDisplayMode
а затем добавить настраиваемый UIBarButtonItem. Вот мое решение:
func targetDisplayModeForActionInSplitViewController(svc: UISplitViewController) -> UISplitViewControllerDisplayMode {
if svc.displayMode == UISplitViewControllerDisplayMode.PrimaryHidden || svc.displayMode == UISplitViewControllerDisplayMode.PrimaryOverlay {
self.navigationItem.leftBarButtonItem = UIBarButtonItem(image: UIImage(named:"menu.png"),
landscapeImagePhone: UIImage(named:"menu.png"),
style: UIBarButtonItemStyle.Plain,
target: self.splitViewController!.displayModeButtonItem().target,
action: self.splitViewController!.displayModeButtonItem().action)
}else {
// disable button on landscape
if UIApplication.sharedApplication().statusBarOrientation == UIInterfaceOrientation.LandscapeLeft || UIApplication.sharedApplication().statusBarOrientation == UIInterfaceOrientation.LandscapeRight {
self.navigationItem.leftBarButtonItem?.enabled = false
}
}
return UISplitViewControllerDisplayMode.Automatic
}
делать это в targetDisplay делает трюк, но удаление/добавление кнопки видится в конце вращения, лучше сделать это в splitViewController: willChangeToDisplayMode: displayMode, но имейте в виду, что это также нужно обрабатывать на viewDidLoad так как этот метод делегата не вызывается при запуске.
- (void)splitViewController:(UISplitViewController *)svc willChangeToDisplayMode:(UISplitViewControllerDisplayMode)displayMode
{
if (displayMode == UISplitViewControllerDisplayModePrimaryHidden || displayMode == UISplitViewControllerDisplayModePrimaryOverlay) {
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Lista" style:UIBarButtonItemStylePlain target:self.splitViewController.displayModeButtonItem.target action:self.splitViewController.displayModeButtonItem.action];
} else {
self.navigationItem.leftBarButtonItem = nil;
}
}
У меня такая же проблема.
Вот как я собираюсь это решить, я обновлю свои результаты.
UIBarButtonItem
, возвращаемый displayModeButtonItem
, управляется UISplitViewController
в свое время. Поэтому любые сделанные вами изменения блокируются.
Однако есть новая функция делегата:
- (UISplitViewControllerDisplayMode)targetDisplayModeForActionInSplitViewController:(UISplitViewController *)svc
Я собираюсь создать свой собственный UIBarButtonItem
, который изменится в зависимости от того, когда эта функция срабатывает.
Затем я заставлю его запустить режим отображения.
Этот текст задается установкой свойства текста "Назад Button" элемента навигации в главном контроллере просмотра через построитель интерфейса
Я хотел обновить это с помощью правильного решения, чтобы показать заголовок в displayModeButtonItem. Этот метод показывает обратную стрелку, а также соответствующий текст. Большинство из вышеперечисленных решений не включают в себя обратную стрелку в конце, из того, что я мог сказать. Я попытался установить это несколько разных способов, но его всегда удаляли, когда главное представление открывалось и закрывалось снова (iPad Portrait), оставляя меня только со стрелкой назад.
Вы должны установить свойство "Заголовок" на навигационном контроллере Master View.
Обратите внимание, что это отличается от установки текстов "Назад" и "Заголовок" в навигационном элементе главного представления. Настройка на навигационном элементе НЕ будет работать.
Итак, я искал способ реализовать пользовательскую кнопку на моем UISplitViewController, кнопку, которая показывает RootViewController (боковой ящик или наложение, независимо от его имени). Я пришел на эту страницу, и вопрос заключается в том, чтобы изменить кнопку, которая отправляется из UISplitViewControllerDelegate. Похоже, что нет никакого вызова, который вы можете реализовать в этом делетете, но вы можете просто установить кнопку как элемент пользовательской панели.
В элементе DetailViewController, в режиме просмотра без наложения, вам просто нужно объявить его и указать действие и цель вашей настраиваемой кнопки, чтобы они были такими же, как кнопка UISplitViewController
self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: self.splitViewController!.displayModeButtonItem().target, action: self.splitViewController!.displayModeButtonItem().action)
Проблема со всеми вышеперечисленными решениями заключается в том, что обратное изображение кнопки не отображается, по крайней мере, не в моем проекте, где я пытался создать свой собственный элемент панели кнопок. При использовании UISplitViewController displayModeButtonItem и установки элемента управления левой кнопкой мыши главного контроллера для дополнения элемента кнопки "Назад" (controller.navigationItem.leftItemsSupplementBackButton = YES) символ появляется перед заголовком элемента левой кнопки. С обычным, это не так.
Я попробовал решение EmilDo, но кнопка навигации не отображалась. Я немного изменил решение и получил его работу со следующим кодом:
DetailViewController:
override func viewDidLayoutSubviews() {
if splitViewController!.displayMode == UISplitViewControllerDisplayMode.PrimaryHidden || splitViewController!.displayMode == UISplitViewControllerDisplayMode.PrimaryOverlay {
let displayModeButton = splitViewController!.displayModeButtonItem()
let searchButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Search, target: displayModeButton.target, action: displayModeButton.action)
navigationItem.leftBarButtonItem = searchButton
} else {
navigationItem.leftBarButtonItem = nil
}
}
SplitViewController:
func splitViewController(svc: UISplitViewController, willChangeToDisplayMode displayMode: UISplitViewControllerDisplayMode) {
svc.view.setNeedsLayout()
}