2010-02-24 2 views
11

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

Спасибо!

ответ

17

Я боролся с несколькими подходами к этому и, наконец, понял это, используя все ответы из нескольких источников. Есть несколько трюков; этот фрагмент будет показывать все это (я создавал на заказ 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

+3

Вы можете скачать, Retina совместимые, прозрачные изображения здесь: [link] http://handleopenurl.com/assets/docs/arrow-buttons.zip [/ link] Стрелка назад имеет leftCap из 15, вперед 5 . (у кнопок нормального размера.) –

+2

У вас есть утечка памяти, когда вы назначаете 'UIBarButtonItem' 'сохранить +1', а затем присваиваете его свойству' rightBarButtonItem' 'сохранить +1'. Это означает, что UIBarButtonItem теперь будет иметь счетчик в 2 и никогда не будет выпущен. Вы должны автореклассифицировать UIBarButtonItem: 'self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView: forwardButton] autorelease];' – Camsoft

+1

images links gone – Esqarrouth

4

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

[[UIBarButtonItem alloc] initWithCustomView: arrowButton]; 

Надеется, что это помогает.

7

Сделайте особый фон. См. Creating a left-arrow button (like UINavigationBar's "back" style) on a UIToolbar.


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


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

UIButton* backButton = [UIButton buttonWithType:101]; 

создать заднюю "кнопку".

+0

что кодовый номер для нападающего кнопку указывающего? – ma11hew28

+0

@Matt: Это не встроенный тип кнопки. – kennytm

+5

Быстрый взломать, слишком поздно: кнопка вперед - это кнопка назад с преобразованием = шкала (-1,1) и чья textLabel имеет значение transform = scale (-1,1). – Cyrille

0

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

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

0

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

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; 
0

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

Хитрость заключается в том, чтобы изменить название первых ОК в viewWillDisappear и повторно установить его, конечно, в viewWillAppear

(Излишне говорить, что по умолчанию, если нет leftBarButtonItem набора, UINavigationController покажет обратно кнопка с названием ВК, что подтолкнула ток ВК)

в ВК, где вы толкнуть свой текущий VC, сделать

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

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