7

Я пытаюсь настроить backBarButtonItem с настраиваемым изображением (текст «назад» входит в этот образ), вот текущий результат:Настройка BackBarButtonItem

http://i.imgur.com/rFxFt.png

Кто-нибудь знает, почему это может произойти?

Вот мой код на viewDidLoad (на самом деле работает как на родительском контроллере, а затем снова на новый контроллер, который имеет кнопку назад)

UIImage *backButtonImage = [UIImage imageNamed:@"Graphics/Shared/navigation_back_button.png"]; 


UIBarButtonItem *backButton = [[UIBarButtonItem alloc] 
           initWithImage:backButtonImage 
           style:UIBarButtonItemStylePlain 
           target:nil 
           action:nil]; 


self.navigationItem.backBarButtonItem = backButton; 

Edit: Я использую IOS 5, кстати! Может быть, внешний вид прокси можно использовать, но до сих пор, когда я пытался использовать его для элемента back button (в appDelegate), приложение просто сработало.

+0

обязательно подтвердите соответствующий ответ! –

ответ

16

Хорошо, я решил эту проблему, используя немного грубый трюк, но, по крайней мере, это работает. Если кто-нибудь придумает более стандартное решение, пожалуйста, дайте мне знать!

Вот мой код:

UIImage *backButtonImage = [[UIImage imageNamed:@"Graphics/Shared/navigation_back_button.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)]; 
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault]; 

Это в методе моей AppDelegate в:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

Чтобы остановить его растяжения при использовании его в качестве фона я использовал идею из iOS 5: How to implement a custom (image) back button

Но затем изменил его, вместо того, чтобы установить -

self.title = @" "; 

На каждом виде нагрузки (и это может также связываться с самим баром названием нав)

Я просто установить смещение для «назад» текста кнопки в два раза больше высоты изображения, так что вы никогда не будете видеть это.

Зачем переходить ко всем этим неприятностям, а не использовать элемент левой кнопки со своим собственным методом, чтобы вытащить контроллер вида?

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

Надеюсь, что это решает и чужую проблему, я знаю, что я застрял на ней в течение 3 часов!

+0

, чтобы проверить мой ответ, который позволяет избежать изменения размера изображения и настройки позиции. – Gon

0

«UIBarButtonItemStylePlain» обозначает стиль кнопки.

попробуйте создать кнопку назад этот путь вместо этого:

UIImage *backButtonImage = [UIImage imageNamed:@"Graphics/Shared/navigation_back_button.png"]; 
CGRect frameimg = CGRectMake(0, 0, backButtonImage.size.width, backButtonImage.size.height); 
UIButton *someButton = [[UIButton alloc] initWithFrame:frameimg]; 
[someButton setBackgroundImage:backButtonImage forState:UIControlStateNormal]; 
// you have to do your own backButtonAction to pop the view controller, b.t.w. 
[someButton addTarget:self action:@selector(backButtonAction:) 
    forControlEvents:UIControlEventTouchUpInside]; 
[someButton setShowsTouchWhenHighlighted:YES]; 

UIBarButtonItem *backButton =[[UIBarButtonItem alloc] initWithCustomView:someButton]; 
[someButton release]; 

self.navigationItem.backBarButtonItem = backButton; 
+0

Спасибо за попытку Майкла, но когда я использую ваш код, кнопка «Назад» просто полностью возвращает обычный синий стиль без настройки. (Я думаю, что уже пробовал много вариантов, подобных этому методу) Я замечаю из вашей строки «release», что я должен указать, что я использую iOS 5! Таким образом, это, вероятно, сильно изменилось, моя ошибка за то, что я не понял это изначально. –

+4

Документы Apple: ** При настройке элемента панели, не назначайте ему индивидуальное представление; элемент навигации в любом случае игнорирует пользовательские представления в кнопке панели. ** –

+1

@AshleyMills совершенно прав. Этот ответ работает только для 'leftBarButtonItem' и' rightBarButtonItem', а не для 'backBarButtonItem'. – Gon

0

В этом случае я обнаружил, что проще заменить barButtonItem, просто с пользовательской кнопки.

Не совсем уверен, как вы разработали проект, но это сработало для меня.

The setting for the custom button

The back button, resulting look

Затем прикрепить этот код к нему:

//go back to the previous screen 

-(IBAction)back{ 

[self dismissModalViewControllerAnimated:YES]; 

} 
+1

Это все хорошо, но потом я теряю стандартную скользящую анимацию, когда я выхожу на контроллер вида. Это также происходит для этого проекта. Я вообще не использую конструктор интерфейса или файлы nib/xib. Я программно создаю все. –

+0

На самом деле не отвечает на его вопрос. Вы теряете возможность использовать и использовать стандартный UINavigationBar –

0

Я пробовал много сегодня и получил это решение. Он отделял background image и button image, кажется проще и не так сложно.

UIImage *bgImage = [UIImage imageNamed:@"the-same-image-as-your-navbar-background-image"]; 
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:bgImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:bgImage forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; 

UIImage *buttonImage = [UIImage imageNamed:@"your-back-button-image"]; 
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:buttonImage style:UIBarButtonItemStylePlain target:nil action:nil]; 
self.navigationItem.backBarButtonItem = backButton;