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

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


person AJ.    schedule 31.07.2009    source источник


Ответы (3)


Да, ты можешь.

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

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];.

person lostInTransit    schedule 31.07.2009

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

-(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;
   }
}
person Gil Margolin    schedule 17.09.2011

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

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

@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)]; 
person Nikita Pestrov    schedule 22.06.2012