IPhone: создание UIBarButtonItem, который имеет форму стрелки

У меня есть UIBarButtonItem на панели навигации. Я хотел бы сделать его стрелой. Под этим я подразумеваю, что я хочу, чтобы он был квадратным, за исключением узкой стороны. Кто-нибудь знает, как это сделать?

Спасибо!

Ответ 1

Я боролся с несколькими подходами к этому и, наконец, понял это, используя все ответы из нескольких источников. Есть несколько трюков; этот фрагмент покажет все (я создавал пользовательский rightNavButton, но вы можете легко адаптировать его для любого UIBarButtonItem):

// Produces a nice "right arrow" style button that mirrors the back arrow
// automatically added by the navController
//
UIImage *buttonImage = [UIImage imageNamed:@"forwardButton.png"];
UIButton *forwardButton = [UIButton buttonWithType:UIButtonTypeCustom];
[forwardButton setBackgroundImage:buttonImage forState:UIControlStateNormal];
[forwardButton setTitle:@"Meter" forState:UIControlStateNormal];
forwardButton.font = [UIFont boldSystemFontOfSize:12];
forwardButton.frame = CGRectMake(0, 0, buttonImage.size.width, buttonImage.size.height);
[forwardButton addTarget:self action:@selector(showMeter) 
           forControlEvents:UIControlEventTouchUpInside];

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] 
           initWithCustomView:forwardButton];

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

Это изображение, которое я использовал на непрозрачном черном navBar (вы можете использовать что угодно, очевидно): http://raretiger.com/images/forwardbutton.pngзабастовкa >

Ответ 2

Создайте собственный фон. См. Создание кнопки со стрелкой влево (например, стиль "UINavigationBar" ) на UIToolbar для чего.


Вы можете -pushNavigationItem:animated: сделать встроенную кнопку возврата, хотя вы не можете назначить ему специальные действия.


Для недокументированных методов вы можете использовать

UIButton* backButton = [UIButton buttonWithType:101];

для создания обратного "button".

Ответ 3

Вы можете создать UIImageView или UIButton с требуемым изображением, затем использовать:

[[UIBarButtonItem alloc] initWithCustomView: arrowButton];

Надеюсь, что это поможет.

Ответ 4

Продолжая идею @Plamen Dragozov: я заметил, что если вы оставите uibutton как есть, это вызовет настройку изображения при касании, и это совершенно противоположно тому, что делает обычная кнопка назад. Так что я сделал это, чтобы снять флажок "подсвечивать настройки изображения", и это работает как шарм.

надеюсь, что это поможет новичкам, как я.

Ответ 5

Более элегантное решение:

UIBarButtonItem * backButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Title" style:UIBarButtonItemStylePlain target:self action:@selector(back:)];
[backButtonItem setBackgroundImage:[UIImage imageNamed:@"back.png"]      forState:UIControlStateNormal     barMetrics:UIBarMetricsDefault];
self.navigationItem.leftBarButtonItem = backButtonItem;

Ответ 6

Моя проблема заключалась в переименовании кнопки "Назад", которая появляется на толкаемом контроллере. Я нашел грязный обходной путь, и если вы проигнорируете неидеальную проблему с анимацией, вы получите обратную кнопку с названием, которое вы хотите.

Трюк состоит в том, чтобы изменить заголовок первого VC в viewWillDisappear и повторно установить его, конечно, в viewWillAppear

(Разумеется, по умолчанию, если нет leftBarButtonItem set, UINavigationController отобразит кнопку возврата с заголовком VC, который нажал текущий VC)

В VC, где вы нажимаете текущий VC, сделайте

-(void) viewWillDisappear:(BOOL) animated {
  [super viewWillDisappear:animated];
  self.title = @"Back";
}

-(void) viewWillAppear:(BOOL) animated {
  [super viewWillAppear:animated];
  self.title = @"Original Title";
}