Настройка пользовательского изображения для кнопки "Назад" на UINavigationBar
Я пытаюсь установить пользовательский образ для кнопки "Назад", которая автоматически попадает на панель навигации, когда новое представление помещается в стек.
Я попытался добавить в viewDidLoad родительский viewController следующее:
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:[UIImage imageNamed:@"BackButton.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
Я также пробовал следующее:
UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"BackButton.png"] style:UIBarButtonItemStyleBordered target:nil action:nil];
self.navigationItem.backBarButtonItem = btn;
Использование UIAppearance дает довольно странные результаты:
![The BackButton image seems to be placed underneath the original title]()
Ответы
Ответ 1
попробуйте этот код
UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeCustom];
UIImage *backBtnImage = [UIImage imageNamed:@"BackBtn.png"] ;
[backBtn setBackgroundImage:backBtnImage forState:UIControlStateNormal];
[backBtn addTarget:self action:@selector(goback) forControlEvents:UIControlEventTouchUpInside];
backBtn.frame = CGRectMake(0, 0, 54, 30);
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithCustomView:backBtn] ;
self.navigationItem.leftBarButtonItem = backButton;
затем определите метод goback, подобный этому
- (void)goback
{
[self.navigationController popViewControllerAnimated:YES];
}
Ответ 2
С iOS 7.0 в API backIndicatorImage
появился новый метод. Вы можете использовать его вместо setBackButtonBackgroundImage
, если вы не хотите, чтобы изображение было растянуто в соответствии с текстом (например, если вы хотите использовать специальную стрелку с фиксированным размером). Вот пример в быстрой:
let image = UIImage(named: "back_button")
UINavigationBar.appearance().backIndicatorImage = image
UINavigationBar.appearance().backIndicatorTransitionMaskImage = image
С помощью этого трюка можно скрыть текст от кнопки:
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -66), for: .default)
Ответ 3
Это код, который я использую и отлично работаю в своем приложении iOS 5. Этот код от application:didFinishLaunchingWithOptions:
в делегате приложения:
UIImage * backButtonImage = [UIImage imageNamed: @"back-button-image"];
backButtonImage = [backButtonImage stretchableImageWithLeftCapWidth: 15.0 topCapHeight: 30.0];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage: backButtonImage forState: UIControlStateNormal barMetrics: UIBarMetricsDefault];
Вам может понадобиться растягиваемое изображение, где левая "точка" - это левая крышка
или в Swift
let backButtonImage = UIImage(named: "back-button-image")
backButtonImage = backButtonImage?.stretchableImageWithLeftCapWidth(15, topCapHeight: 30)
UIBarButtonItem.appearance().setBackButtonBackgroundImage(backButtonImage, forState: .Normal, barMetrics: .Default)
Ответ 4
версия iOS 8+ Swift (может быть преобразована в ObjC с небольшим усилием). Этот метод сохраняет все преимущества и поведение навигационной панели, связанные со стандартной кнопкой возврата (анимация при нажатии/всплывании, интерактивный позыв и т.д.)
// Call the code ONE TIME somewhere on app launch to setup custom back button appearance
UINavigationBar.appearance().tintColor = UIColor.blackColor()
// If you need custom positioning for your back button, in this example button will be 1 px up compared to default one
// Also only vertical positioning works, for horizontal add offsets directly to the image
let backImageInsets = UIEdgeInsetsMake(0, 0, -1, 0)
// Get image, change of rendering (so it preserves offsets made in file), applying offsets
let backImage = UIImage(named: "YourButtonImageAssetFileName")?.imageWithRenderingMode(.AlwaysOriginal).imageWithAlignmentRectInsets(backImageInsets)
// Setting images
UINavigationBar.appearance().backIndicatorImage = backImage
UINavigationBar.appearance().backIndicatorTransitionMaskImage = backImage
// Call EACH TIME BEFORE pushing view controller if you don't need title near your back button arrow
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
// Push controller
self.navigationController?.pushViewController(vc, animated: true)
Ответ 5
Попробуйте код ниже, он работает для меня:
[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"back-button-image"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"back-button-image"]];
Ответ 6
Этот код работал для Swift 5 и XCode 10:
Добавьте этот код в func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) → Bool
AppDelegate func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) → Bool
для применения ко всем вашим контроллерам представлений:
//Custom back button
let barButtonItemAppearance = UIBarButtonItem.appearance()
barButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
barButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .highlighted)
let backImg: UIImage = UIImage(named: "back")!
barButtonItemAppearance.setBackButtonBackgroundImage(backImg, for: .normal, barMetrics: .default)
let image = UIImage()
UINavigationBar.appearance().backIndicatorImage = image
UINavigationBar.appearance().backIndicatorTransitionMaskImage = image
Ответ 7
Это сработало для меня:
let button1 = UIBarButtonItem(
image: #imageLiteral(resourceName: "back_arrow"),
style: .plain,
target: self,
action: #selector(self.backBtnTapped(_:))
)
self.navigationItem.leftBarButtonItem = button1
Ответ 8
Напишите этот метод в общем классе и вызовите его из контроллера, в котором вы хотите рисовать.
(UIButton *)drawNavigationBarBackButton:(UIViewController*)viewController
{
UIImage *navBackImage = nil;
UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
navBackImage = [UIImage imageNamed:@"Back_Button"];
[backButton setImage:navBackImage forState:UIControlStateNormal];
UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithCustomView:backButton];
viewController.navigationItem.leftBarButtonItem = leftButton;
return backButton;
}
вызов из класса контроллера и увидеть действие
-
(void) viewDidLoad {[super viewDidLoad]; UIButton * backButton = [CommonClass drawNavigationBarBackButton: self]; [backButton addTarget: self action: @selector (onTapBackButton) forControlEvents: UIControlEventTouchUpInside]; }
-
(void) onTapBackButton {[self.navigationController popViewControllerAnimated: YES]; }