2010-08-17 3 views
17

Для приложения, которое я разрабатываю, мне нужно отобразить пользовательскую кнопку «Назад» в панели навигации. У меня есть кнопка актив в качестве PNG изображения, и я пишу этот код:Пользовательская кнопка возврата в UINavigationController

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    backButton.frame = CGRectMake(0, 0, 79, 29.0); 
    [backButton setImage:[UIImage imageNamed:@"button_back.png"] forState:UIControlStateNormal]; 
    self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:backButton] autorelease]; 

}

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

Вещи, которые я уже пробовали:

  1. Рскладной проверить, что кнопка backButton создается должным образом, путем добавления его в иерархии представлений. Он отображается правильно.
  2. В том же методе, изменил свойство titlenavigationItem и подтвердил, что он меняет (как и ожидалось) содержимое моей кнопки возврата.

Может ли кто-нибудь определить, что я делаю неправильно? Удалось ли использовать пользовательское изображение в качестве кнопки «Назад» с помощью UINavigationController?

ответ

5

Недвижимость backBarButtonItem работает по назначению, но всегда будет добавлять стандартную форму и цвет кнопки в зависимости от цвета оттенка панели навигации.

Вы можете настроить текст, но не заменять изображение.

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

3

Confusingly backBarButtonItem не то, что вы ищете.

Он просто управляет заголовком на задней кнопке для следующего контроллера вида. Вы хотите установить leftBarButtonItem на пользовательскую кнопку возврата.

+3

Я думаю, что хочу «backBarButtonItem». Я хочу контролировать, как будет выглядеть обратная кнопка, когда 'UIViewController' будет нажата в стек' UINavigationController'. Действительно, незначительные изменения в 'backBarButtonItem' работают так, как ожидалось, это просто нестандартное представление, которое не придерживается. – pgb

+1

заднийBarButtonItem свойство работает. Просто нужно установить его в нужное время. – SundayMonday

0

Просто создайте UIBarButtonItem вместо встроенного UIButton в UIBarButtonItem. Работает отлично!

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"button_back.png"] style:UIBarButtonItemStyleBordered target:nil action:nil]; 

self.navigationItem.backBarButtonItem = backButton; 
+1

Это не работает. Фоновое изображение кнопки «Назад» все еще отображается (если изображение, которое вы используете, больше, чем изображение кнопки «Назад») – probablyCorey

+0

http: // stackoverflow.com/questions/526520/how-to-create-backbarbuttomitem-with-custom-view-for-a-uinavigationcontroller/7184426 # 7184426 – SundayMonday

18

Начиная с прошивкой 5, это просто:

[[UIBarButtonItem appearance] 
      setBackButtonBackgroundImage:[UIImage imageNamed:@"back_button.png"] 
      forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 

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

+27

Это не скрывает название откидывающейся кнопки – user366584

+5

Любой способ скрыть заголовок подсказки? – ArdenDev

+1

Таким образом, ширина фона зависит от длины заголовка. Изображение будет растянуто в соответствии с длиной названия. – Add080bbA

13

Я перепроведение моего решения от https://stackoverflow.com/a/16831482/171933:

создать простую категорию на UIViewController:

UIViewController + ImageBackButton.h

#import <UIKit/UIKit.h> 

@interface UIViewController (ImageBackButton) 

- (void)setUpImageBackButton; 

@end 

UIViewController + ImageBackButton.m

#import "UIViewController+ImageBackButton.h" 

@implementation UIViewController (ImageBackButton) 

- (void)setUpImageBackButton 
{ 
    UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 34, 26)]; 
    [backButton setBackgroundImage:[UIImage imageNamed:@"back_arrow.png"] forState:UIControlStateNormal]; 
    UIBarButtonItem *barBackButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton]; 
    [backButton addTarget:self action:@selector(popCurrentViewController) forControlEvents:UIControlEventTouchUpInside]; 
    self.navigationItem.leftBarButtonItem = barBackButtonItem; 
    self.navigationItem.hidesBackButton = YES; 
} 

- (void)popCurrentViewController 
{ 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

@end 

Теперь все, что вам нужно сделать, это #import UIViewController+ImageBackButton.h в любом все контроллеры просмотреть или в пользовательском базового представления класса контроллера, что ваши другие контроллеры просматривать унаследовать от и реализации viewWillAppear: метода:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [self setUpImageBackButton]; 
} 

Вот и все. Теперь у вас есть кнопка возврата изображения повсюду. Без границы. Наслаждайтесь!

+0

[backButton addTarget: self.navigationController action: @selector (popViewControllerAnimated :) forControlEvents: UIControlEventTouchUpInside]; не предоставляет «анимированный» аргумент и не определен. лучше просто добавить метод, который явно предоставляет «анимированный» аргумент –

+0

@OrArbel Спасибо, ты прав. Он работает так, как он есть, но его явственно называть его чистым. Я отредактировал код :) –

+1

Это прекрасно, но отключит салфетки, чтобы вернуться, если вы спрячете кнопку «Назад». Таким образом, ИМО вы теряете больше, чем получаете. – AppHandwerker

3

Не самое простое решение просто спроектировать его из раскадровки с любым изображением или цветами, которые вы хотите, и просто перетащить новое действие на ваш контроллер?

Swift Code

@IBAction func backButton(sender: AnyObject) { 
    self.navigationController?.popViewControllerAnimated(true) 
} 
+3

SO так здорово! Я задал этот вопрос в 2010 году, и теперь я получаю ответ с примерным кодом Swift и предлагаю использовать раскадровки :) – pgb

1

Я не думаю, что сам ViewController должен ничего знать о своей кнопки обратно Согласно ООП это ответственность containerViewController, в котором вставлен ваш контроллер представления , например, UINavigationController.

Подкласса вашего NavigationController и перегрузки в нем метод суперкласса, как это: Ответ работа

@implementation STONavigationController 

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    [super pushViewController:viewController animated:animated]; 
    if ([self.viewControllers indexOfObject:viewController] != NSNotFound && 
     [self.viewControllers indexOfObject:viewController] > 0){ 
     UIImage *img = [UIImage imageNamed:@"back-1"]; 
     UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, img.size.width * 2, img.size.height * 2)]; 
     [backButton setBackgroundImage:img forState:UIControlStateNormal]; 
     UIBarButtonItem *barBackButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton]; 
     [backButton addTarget:self action:@selector(popCurrentViewController) forControlEvents:UIControlEventTouchUpInside]; 
     viewController.navigationItem.leftBarButtonItem = barBackButtonItem; 
     viewController.navigationItem.hidesBackButton = YES; 
    } 
} 

- (void)popCurrentViewController 
{ 
    [self popViewControllerAnimated:YES]; 
} 

@end 
1

Иоганн Fahrenkrug, но заднее изображение будет появляться в очень проводное положении.

Здесь я нашел лучший способ позиционировать изображение в нужном месте:

Убедитесь, что у вас есть заднее изображение с размером 24x24 (@ 1x), я называю это backImage

Выполните следующий код когда ваше приложение Launch

UINavigationBar.appearance().barTintColor = nil 
UINavigationBar.appearance().backIndicatorImage = backImage 
UINavigationBar.appearance().backIndicatorTransitionMaskImage = backImage 
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), forBarMetrics: .Default) 
+0

У меня есть setBackButtonTitlePositionAdjustment на didFinishLaunchingWithOptions, и на некоторых экранах я могу увидеть заголовок кнопки «Назад»: –

0

Как @pgb предложил вы можете использовать leftBarButtonItem вместо заднего пункта кнопки. И чтобы удалить элемент кнопки «Назад» по умолчанию, установите его равным нулю;

navigationController?.navigationBar.backIndicatorImage = nil 
navigationController?.navigationBar.backIndicatorTransitionMaskImage = nil 

let button = UIButton.init(type: .custom) 
button.imageView?.contentMode = UIViewContentMode.scaleAspectFit 
button.setImage(UIImage.init(named: "top_back"), for: UIControlState.normal) 
button.frame = CGRect.init(x: 0, y: 0, width: 75, height: 50) 
button.addTarget(self, action: #selector(handleBackButton), for: .touchUpInside) 

let barButton = UIBarButtonItem.init(customView: button) 
self.navigationItem.leftBarButtonItem = barButton 
Смежные вопросы