Создание кнопки со стрелкой влево (например, стиль «назад» UINavigationBar) на панели инструментов UIToolbar - PullRequest
286 голосов
/ 22 октября 2008

Я бы хотел создать кнопку «назад» влево-стрелка в UIToolbar.

Насколько я могу судить, единственный способ получить один из них - оставить UINavigationController с настройками по умолчанию, и он использует один для элемента левой панели. Но я не могу найти способ создать его как UIBarButtonItem, поэтому я не могу сделать его в стандартном UIToolbar, даже если они очень похожи на UINavigationBar s.

Я мог бы создать его вручную с помощью изображений кнопок, но нигде не могу найти исходные изображения. У них есть края альфа-канала, поэтому скриншоты и обрезка не дадут очень разносторонних результатов.

Какие-нибудь идеи помимо скриншотов для каждого размера и цветовой схемы, которые я собираюсь использовать?

Обновление: ПОЖАЛУЙСТА, ОСТАНОВИТЕСЬ, уклоняясь от вопроса и предлагая мне не задавать этот вопрос и использовать UINavigationBar Мое приложение - Instapaper Pro. Он показывает только нижнюю панель инструментов (для экономии места и максимизации читаемой области содержимого), и я хочу поместить кнопку Back в форме стрелки влево внизу.

Сказать, что мне не нужно это делать - не ответ и, конечно, не заслуживает награды.

Ответы [ 23 ]

4 голосов
/ 21 октября 2010

Я обнаружил, что с помощью следующего простого кода добился цели (требуется пользовательское изображение в комплекте):

// Creates a back button instead of default behaviour (displaying title of previous screen)
    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_arrow.png"]
                                                                   style:UIBarButtonItemStyleBordered
                                                                  target:self
                                                                  action:@selector(backAction)];

    tipsDetailViewController.navigationItem.leftBarButtonItem = backButton;
    [backButton release];
4 голосов
/ 25 мая 2012

Вот что я в итоге сделал после поиска по всем этим и другим решениям. Он использует растягиваемый PNG, извлеченный из изображений UIKit. Таким образом, вы можете установить текст, как вам нравится

// Generate the background images
UIImage *stretchableBackButton = [[UIImage imageNamed:@"UINavigationBarDefaultBack.png"] stretchableImageWithLeftCapWidth:14 topCapHeight:0];
UIImage *stretchableBackButtonPressed = [[UIImage imageNamed:@"UINavigationBarDefaultBackPressed.png"] stretchableImageWithLeftCapWidth:13 topCapHeight:0];
// Setup the UIButton
UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
[backButton setBackgroundImage:stretchableBackButton forState:UIControlStateNormal];
[backButton setBackgroundImage:stretchableBackButtonPressed forState:UIControlStateSelected];
NSString *buttonTitle = NSLocalizedString(@"Back", @"Back");
[backButton setTitle:buttonTitle forState:UIControlStateNormal];
[backButton setTitle:buttonTitle forState:UIControlStateSelected];
backButton.titleEdgeInsets = UIEdgeInsetsMake(0, 5, 2, 1); // Tweak the text position
NSInteger width = ([backButton.titleLabel.text sizeWithFont:backButton.titleLabel.font].width + backButton.titleEdgeInsets.right +backButton.titleEdgeInsets.left);
[backButton setFrame:CGRectMake(0, 0, width, 29)];
backButton.titleLabel.font = [UIFont boldSystemFontOfSize:13.0f];
[backButton addTarget:self action:@selector(yourSelector:) forControlEvents:UIControlEventTouchDown];
// Now add the button as a custom UIBarButtonItem
UIBarButtonItem *backButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:backButton] autorelease];
self.navigationItem.leftBarButtonItem = backButtonItem;
4 голосов
/ 30 января 2014

Это легко сделать с помощью Interface Builder в Xcode 5.x

Result

  • использование Панель инструментов и Элемент панели кнопок из Библиотека объектов

    Components

  • в кнопке Инспектор атрибутов редактировать Изображение раздел с вашим изображением кнопки назад

    Attributes inspector

Готово!

2 голосов
/ 04 сентября 2010

Я пытался сделать то же самое, но я хотел, чтобы кнопка «Назад» была на панели навигации. (На самом деле мне нужна была кнопка «Назад», которая делала бы больше, чем просто возвращался назад, поэтому мне пришлось использовать свойство leftBarButtonItem). Я попробовал то, что предложил AndrewS, но на панели навигации это не выглядело бы так, как должно, так как UIButton был отчасти приведен к UIBarButtonItem.

Но я нашел способ обойти это. На самом деле я просто помещаю UIView под UIButton и устанавливаю customView для UIBarButtonItem. Вот код, если кому-то это нужно:

// initialize button and button view
UIButton *backButton = [UIButton buttonWithType:101];
UIView *backButtonView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, backButton.frame.size.width, backButton.frame.size.height)];

[backButton addTarget:self action:@selector(backButtonTouched:) forControlEvents:UIControlEventTouchUpInside];
[backButton setTitle:@"Back" forState:UIControlStateNormal];
[backButtonView addSubview:backButton];

// set buttonview as custom view for bar button item
UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButtonView];
self.navigationItem.leftBarButtonItem = backButtonItem;

// push item to navigationbar items
[self.navigationController.navigationBar setItems:[NSArray arrayWithObject:backButtonItem]];
1 голос
/ 29 августа 2014

Решение без использования PNG. Основываясь на этом ответе SO: Добавление маленькой стрелки к правой стороне ячейки в ячейке iPhone TableView

Просто переверните UITableViewCell по горизонтали!

UIButton *btnBack = [[UIButton alloc] initWithFrame:CGRectMake(0, 5, 70, 20)];

// Add the disclosure
CGRect frm;
UITableViewCell *disclosure = [[UITableViewCell alloc] init];
disclosure.transform = CGAffineTransformScale(CGAffineTransformIdentity, -1, 1);
frm = self.btnBack.bounds;
disclosure.frame = CGRectMake(frm.origin.x, frm.origin.y, frm.size.width-25, frm.size.height);
disclosure.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
disclosure.userInteractionEnabled = NO;
[self.btnBack addSubview:disclosure];

// Add the label
UILabel *lbl = [[UILabel alloc] init];
frm = CGRectOffset(self.btnBack.bounds, 15, 0);
lbl.frame = frm;
lbl.textAlignment = NSTextAlignmentCenter;
lbl.text = @"BACK";
[self addSubview:lbl];
1 голос
/ 25 февраля 2009

Чтобы создать изображение для панели инструментов UIToolbar, создайте png в фотошопе, и ГДЕ там, где есть ЛЮБОЙ цвет, он помещает его в белый цвет, а где его альфа = 0, то он оставляет его в покое.

SDK фактически помещает границу вокруг созданного вами значка и делает его белым, без необходимости что-либо делать.

Видите, это то, что я сделал в Photoshop для кнопки «вперед» (очевидно, поменяйте местами кнопку «назад»):

http://twitpic.com/1oanv

и вот как он появился в Интерфейсном Разработчике

http://twitpic.com/1oaoa

0 голосов
/ 23 февраля 2009

Если вы хотите избежать рисования самостоятельно, вы можете использовать недокументированный класс: UINavigationButton со стилем 1. Это, конечно, может помешать утверждению вашего приложения ... / John

0 голосов
/ 30 июля 2013

У меня была похожая проблема, и вышла одна библиотека PButton . И пример - кнопка, похожая на кнопку обратной навигации, которую можно использовать в любом месте, как настраиваемую кнопку.

Примерно так: enter image description here

0 голосов
/ 22 августа 2012

Попробуй это. Я уверен, что вам не нужно изображение кнопки «Назад» для создания одного такого.

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back"
                                                               style:UIBarButtonItemStyleBordered
                                                              target:self
                                                              action:@selector(yourSelectorGoesHere:)];
self.navigationItem.backBarButtonItem = backButton;

Это все, что вам нужно сделать:)

0 голосов
/ 09 января 2017

Пример в Swift 3, с предыдущей и следующей кнопкой в ​​правом верхнем углу.

let prevButtonItem = UIBarButtonItem(title: "\u{25C0}", style: .plain, target: self, action: #selector(prevButtonTapped))
let nextButtonItem = UIBarButtonItem(title: "\u{25B6}", style: .plain, target: self, action: #selector(nextButtonTapped))
self.navigationItem.rightBarButtonItems = [nextButtonItem, prevButtonItem]
...