Как показать пользовательское изображение в кнопке «Назад» на панели навигации вместо кнопок по умолчанию, которые отображаются в самой панели навигации - PullRequest
9 голосов
/ 31 июля 2009

При переходе к любому представлению в приложении, в котором реализован контроллер навигации, отображается кнопка «Назад» для перехода к предыдущему представлению. Есть ли способ использовать собственное изображение вместо изображения по умолчанию?

Ответы [ 3 ]

18 голосов
/ 01 августа 2009

Да, вы можете.

Вы можете управлять тем, как будет выглядеть стандартная кнопка «Назад» при нажатии на другой контроллер представления поверх данного контроллера представления, установив элемент кнопки задней панели его элемента навигации (вы можете настроитьназвание или используйте изображение):

UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:nil action:nil];
self.navigationItem.backBarButtonItem = btn;
[btn release];

UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithImage:yourImage style:UIBarButtonItemStyleBordered target:nil action:nil];
self.navigationItem.backBarButtonItem = btn;
[btn release];

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


Вы также можете создать свой собственный UIBarButtonItem и установить его в качестве leftButtonItem на панели навигации на текущем контроллере представления:

UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithImage:yourImage style:UIBarButtonItemStyleBordered target:self action:@selector(yourMethod:)];
self.navigationItem.leftBarButtonItem = btn;
[btn release];

Примечание : в этом случае элемент кнопки задней / левой панели изменяется для текущего контроллера вида (когда он находится сверху).Вы должны реализовать метод yourMethod:.Если вы просто хотите, чтобы кнопка вернулась назад, вам нужно самостоятельно обработать нажатие контроллера представления, позвонив по номеру [self.navigationController popViewControllerAnimated:YES];.

3 голосов
/ 18 сентября 2011

Я обнаружил, что ни одно из решений на самом деле не решило BACK UIBarButton, а также предоставило его скрытое поведение, если контроллер представления является root.

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

- (void)viewWillAppear:(BOOL)animated
{
   [super viewWillAppear:animated];
   if([self.navigationController.viewControllers objectAtIndex:0] != self)
   {
       UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 26, 26)];
       [backButton setImage:[UIImage imageNamed:@"back"] forState:UIControlStateNormal];
       [backButton setShowsTouchWhenHighlighted:TRUE];
       [backButton addTarget:self action:@selector(popViewControllerWithAnimation) forControlEvents:UIControlEventTouchDown];
       UIBarButtonItem *barBackItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
       self.navigationItem.hidesBackButton = TRUE;
       self.navigationItem.leftBarButtonItem = barBackItem;
   }
}
0 голосов
/ 22 июня 2012

Почти работает как кнопка возврата. За исключением анимации перехода (после того, как кнопка нажата и текущий вид отключен от навигации вправо).

Правильный способ - создать категорию.

@interface UINavigationBar (MyNavigationBar)  
-(void)drawRect:(CGRect)rect; 
@end

@implementation UINavigationBar (MyNavigationBar)
-(void)drawRect:(CGRect)rect { 
UIImage *image = [UIImage imageNamed:@"....."];  
[image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
...