Подтвердить что ты не робот

IOS 5: Как реализовать пользовательскую (обратную) кнопку возврата

Я сделал учебное пособие в своем блоге, поэтому я знаю, как сделать растягиваемую кнопку, которая может отображать нижний (стек) заголовок viewcontroller. Но то, что я надеялся сделать, - это значки (например, дом для ДОМА), без текста и без изменения размера.

Используя мой пользовательский образ и этот код ниже, я получаю растянутую версию (не хочу) с заголовком поверх (не нужно), и она нажимает/выделяет при нажатии (это хорошо);

UIImage *backButtonImage = [UIImage imageNamed:@"backButton_30.png"];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

снимок экрана 1

Теперь я искал здесь и читал все похожие вопросы, которые возвращают старые ответы, и имеют для меня странные результаты. Вот код, который я пробовал;

  UIImage *backButtonImage = [UIImage imageNamed:@"backButton_30.png"];
  UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:backButtonImage style:UIBarButtonItemStyleBordered target:nil action:nil];
  self.navigationItem.backBarButtonItem = backButton;

Этот метод не растягивает мою пользовательскую кнопку изображения (это хорошо), и он не отображает текст (что я хочу), но по-прежнему остается исходная синяя кнопка под ним (WTF), и моя пользовательская кнопка не оттенок при нажатии, только синяя кнопка под ним делает!

снимок экрана 2

Пожалуйста, помогите, что мне не хватает?

* UPDATE

Я немного исправил это, используя изменяемый размер изображения. Это заставляет его не "растягивать"

UIImage *backButtonHomeImage = [[UIImage imageNamed:@"backButtonHomeWhite_30.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonHomeImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

Чтобы зафиксировать заголовок, отображаемый на кнопке, которую я должен был сделать

self.title [email protected]" ";

Теперь это немного грязное исправление, но, похоже, оно работает. Единственная проблема, оставшаяся сейчас, заключается в том, что я хочу другую кнопку на разных представлениях, и этот метод вызывает некоторые проблемы; последнее представление, которое устанавливает кнопку, переводит все другие виды. Таким образом, в конце концов, в зависимости от того, как вы перемещаетесь по приложению, возврат к предыдущему виду имеет неправильную кнопку возврата и никогда не сбрасывается на правильный.


ОБНОВЛЕНИЕ 2: ПОТЕНЦИАЛЬНАЯ ИДЕЯ:

Будет ли разумное решение, или это взлом, который может что-то сломать?

Скрытие кнопки возврата по умолчанию, например,

[self.navigationItem setHidesBackButton:YES animated:NO];

... а затем с помощью пользовательского UIBarButtonItem с кнопкой в ​​стиле, который я действительно хочу разместить в месте обратной кнопки, который отправляет popViewControllerAnimated: в UINavigationController при нажатии.

Если вы знаете более надежное решение, поделитесь им, спасибо.

4b9b3361

Ответ 1

Предполагая, что ваше текущее решение

UIImage *backButtonHomeImage = [[UIImage imageNamed:@"backButtonHomeWhite_30.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonHomeImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

является приемлемым для вас, поэтому единственная проблема заключается в том, как обновить эту кнопку, когда вы идете туда и обратно между вашими взглядами, подход, который может работать, выполняет код выше в каждом из методов вашего viewWillAppear:

- (void)viewWillAppear:(BOOL)animated {
    UIImage *backButtonHomeImage = [[UIImage imageNamed:@"backButtonHomeWhite_30.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonHomeImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
}

Если вы не удовлетворены своим текущим подходом к созданию пользовательского UIBarButtonItem, путь к нему - инициализация элемента панели с помощью initWithCustomView:. В этом случае вы можете указать, например, UIImageView с изображением, которое вам нравится, и оно должно работать:

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithCustomView:[UIImageView ...]];

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

Ответ 2

Для iOS 5+ используйте [[UIBarButtonItem appearance] setBackButtonBackgroundImage:[UIImage imageNamed:@"someimage.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault].

Ответ 3

Некоторый код, который я использовал в проекте:

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
UIImage *btnImg = [UIImage imageNamed:@"ButtonRetourInactive"];
[btn setImage:btnImg forState:UIControlStateNormal];

btn.frame = CGRectMake(0, 0, btnImg.size.width, btnImg.size.height);
[btn addTarget:self action:@selector(goBack:) forControlEvents:UIControlEventTouchUpInside];
self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:btn] autorelease];

Обратите внимание, что это работает и на iOS 4 и 3.

Ответ 4

Если вы используете доски объявлений, это слишком легко. возьмите круглую прямоугольную кнопку и поместите ее на панель навигации. затем дважды щелкните по кнопке (при выборе сначала отображаются атрибуты кнопки бара, но, выбрав дважды, вы можете изменить все свои свойства, как если бы вы настраивали обычную кнопку пользовательского интерфейса).

Ответ 5

UIAppearance не используется в этом случае.

Я попытался использовать: - [UIBarButtonItem initWithCustomView:]. Здесь вы можете добавить свое фоновое изображение и заголовок, что бы вы ни пожелали.