Як я можу приховати текст кнопки "Назад" від контролера UINavigation? Я буду мати лише "<", а не "<Назад"
Як я можу приховати текст кнопки "Назад" від контролера UINavigation? Я буду мати лише "<", а не "<Назад"
Відповіді:
У конструкторі інтерфейсів ви можете вибрати елемент навігації попереднього контролера та змінити Back Button
рядок на те, що ви хочете, щоб відображалася кнопка "назад". Якщо ви хочете, щоб воно було порожнім, наприклад, просто поставте пробіл.
Ви також можете змінити його за допомогою цього рядка коду:
[self.navigationItem.backBarButtonItem setTitle:@"Title here"];
Або в Swift :
self.navigationItem.backBarButtonItem?.title = ""
Back Button
в IB є вже порожнє місце, просто додайте пробіл, щоб проїхатися, Back
і просто покажіть стрілку.
Ви також можете це зробити через раскадровку. У інспекторі атрибутів елемента навігації попереднього контролера ви можете встановити "" в полі Назад. Перегляньте зображення нижче. Замініть "Вашу назву тут" на "". Тим самим ви досягнете бажаного результату. Вам більше не потрібно возитися із «заголовком».
Програмно можна використовувати
[self.navigationItem.backBarButtonItem setTitle:@" "];
де self посилається на контролер, який висуває потрібний контролер View.
Зразок до, після панелі навігації
До цього
Після
backBarButtonItem
програмно не працює, але налаштування через дошку розгортки робить.
backBarButtonItem
програмно працює для мене в iOS 9.
Ви можете реалізувати UINavigationControllerDelegate
так:
func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
let item = UIBarButtonItem(title: " ", style: .Plain, target: nil, action: nil)
viewController.navigationItem.backBarButtonItem = item
}
class MyNavigationController: UINavigationController, UINavigationControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
}
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
let item = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
viewController.navigationItem.backBarButtonItem = item
}
}
backBarButtonItem
це nil
за замовчуванням , і це впливає на наступний штовхнув контролер, так що ви просто встановити його для всіх контролерів
Установка назви кнопки назад @""
або nil
не працюватиме. Потрібно встановити порожню кнопку (без заголовка чи зображення):
[self.navigationItem setBackBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]];
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Це слід зробити на контролері перегляду, який знаходиться над вашим контролером перегляду в стеку навігації (тобто, звідки ви переходите до свого ВК за допомогою pushViewController
методу)
Іншим рішенням цієї проблеми для ситуацій, коли у вас є велика кількість контролерів перегляду, є використання UIAppearance
проксі-сервера для ефективного приховування тексту заголовка задньої кнопки таким чином:
UIBarButtonItem *navBarButtonAppearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil];
[navBarButtonAppearance setTitleTextAttributes:@{
NSFontAttributeName: [UIFont systemFontOfSize:0.1],
NSForegroundColorAttributeName: [UIColor clearColor] }
forState:UIControlStateNormal];
Це рішення надасть текст у вигляді крихітної чіткої точки, подібної до ручного встановлення заголовка кнопки "Назад" @" "
, за винятком того, що він впливає на всі кнопки навігації.
Я не пропоную це як загальне рішення проблеми, оскільки це впливає на всі кнопки панелі навігації. Вона перевертає парадигму, щоб ви вибирали, коли показувати заголовки кнопок, а не коли приховувати заголовки.
Щоб вибрати, коли показувати заголовки, або вручну відновіть атрибути тексту заголовка за необхідності, або створіть спеціалізований підклас, UIBarButtonItem
який робить те саме (можливо, з іншим UIAppearance
проксі).
Якщо у вас є додаток, у якому більшість заголовків задньої кнопки потрібно приховати, і лише кілька (або жодна) кнопки навігації - це системні кнопки з заголовками, це може бути для вас!
(Примітка: зміна розміру шрифту потрібна, навіть якщо колір тексту чіткий для того, щоб довгі заголовки не спричиняли зміну заголовка центральної смуги навпроти)
Додайте наступний код у viewDidLoad або loadView
self.navigationController.navigationBar.topItem.title = @"";
Я тестував його в iPhone та iPad з iOS 9
Ви можете додати цю категорію Objective-C, щоб усі кнопки "Назад", створені навігаційним контролером, не мали тексту. Я щойно додав його до свого файлу AppDelegate.m.
@implementation UINavigationItem (Customization)
/**
Removes text from all default back buttons so only the arrow or custom image shows up.
*/
-(UIBarButtonItem *)backBarButtonItem
{
return [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}
@end
PS - (я не знаю, як змусити цю розширення працювати зі Swift, у неї виникали дивні помилки. Редагуйте, щоб додати версію Swift)
override
це швидко. Дуже цікаве питання
Я спробував дещо вище і нижче, але вони не спрацювали. Це працювало для мене:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.topItem?.title = ""
}
Єдине, що працює без побічних ефектів - це створити власну кнопку назад. Поки ви не надаєте власну дію, навіть жест слайда працює.
extension UIViewController {
func setupBackButton() {
let customBackButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
navigationItem.backBarButtonItem = customBackButton
}}
На жаль, якщо ви хочете, щоб усі кнопки "назад" не мали жодних заголовків, вам потрібно встановити цю власну кнопку назад у всіх контролерах перегляду: /
override func viewDidLoad() {
super.viewDidLoad()
setupBackButton()
}
Дуже важливо встановити пробіл як заголовок, а не порожній рядок.
щоб видалити Текст із зворотної кнопки програмно, використовується нижче Кодекс, це працюватиме з формату xcode7 та вище.
self.navigationController.navigationBar.topItem.title = @ "";
або
ПосібникЗайдіть у розклади, виберіть навігаційну панель на контролері перегляду та введіть "" текст тексту "назад".
це спрацює. Дякую
self.navigationController?.navigationBar.topItem?.title = " "
у Xcode 9 і працював!
Поточна відповідь не спрацювала. Я хотів повністю видалити заголовок , але текст "назад" не зникав.
Поверніться до попереднього контролера перегляду та встановіть його властивість заголовка:
self.title = @" ";
ТІЛЬКИ працює, коли попередній контролер перегляду не має заголовка
@""
.
Альтернативний спосіб - використовувати користувальницький клас NavigationBar.
class NavigationBar: UINavigationBar {
var hideBackItem = true
private let emptyTitle = ""
override func layoutSubviews() {
if let `topItem` = topItem,
topItem.backBarButtonItem?.title != emptyTitle,
hideBackItem {
topItem.backBarButtonItem = UIBarButtonItem(title: emptyTitle, style: .plain, target: nil, action: nil)
}
super.layoutSubviews()
}
}
Тобто, це вилучить заголовки всього проекту. Просто встановіть спеціальний клас для UINavigationController.
Установіть заголовок попереднього VC рядка з пробілом. а заголовок із кнопкою "назад" буде замінено на один пробіл.
Self.title = " "
У режимі "Назад" знову натисніть скидання заголовка до оригінального в viewWillAppear.
Використовуйте звичай, NavigationController
який перевизначаєpushViewController
class NavigationController: UINavigationController {
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
viewController.navigationItem.backBarButtonItem =
UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
super.pushViewController(viewController, animated: animated)
}
}
Дуже багато відповідей, ось два мої центи на цю тему. Я вважав цей підхід дійсно надійним. Вам просто потрібно поставити це в viewController перед тим, як ставитись до segue.
Швидкий 4:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
Я спробував усе в цій публікації. Єдине робоче рішення - це @ VoidLess's
Ось та сама відповідь, але більш повна
class CustomNavigationController: UINavigationController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.delegate = self
}
}
// MARK:UINavigationControllerDelegate
extension CustomNavigationController {
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}
}
Це моя резолюція для iOS11, я змінюю зовнішній вигляд UIBarButtonItem у програміDidFinishLaunchingWithOptions:
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-100, 0), for:UIBarMetrics.default)
Ви не можете змінити зміщення Y, оскільки це змінить положення кнопки задньої панелі в iOS11, але це добре в iOS10 та нижче.
У Swift3,
Якщо встановити глобальну настройку
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// ..
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .highlighted)
// ...
}
Swift 3.1 Це можна зробити, застосувавши делегатний метод UINavigationController.
func navigationController(_ navigationController: UINavigationController,
willShow viewController: UIViewController, animated: Bool) {
/** It'll hide the Title with back button only,
** we'll still get the back arrow image and default functionality.
*/
let item = UIBarButtonItem(title: " ", style: .plain, target: nil,
action: nil)
viewController.navigationItem.backBarButtonItem = item
}
Для тих, хто хоче приховати назву кнопки "назад" у всьому світі.
Ви можете Swizzle viewDidLoad
з UIViewController
так.
+ (void)overrideBackButtonTitle {
NSError *error;
// I use `Aspects` for easier swizzling.
[UIViewController aspect_hookSelector:@selector(viewDidLoad)
withOptions:AspectPositionBefore
usingBlock:^(id<AspectInfo> aspectInfo)
{
UIViewController *vc = (UIViewController *)aspectInfo.instance;
// Check whether this class is my app's view controller or not.
// We don't want to override this for Apple's view controllers,
// or view controllers from external framework.
NSString *className = NSStringFromClass([vc class]);
Class class = [NSBundle.mainBundle classNamed:className];
if (!class) {
return;
}
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStylePlain target:nil action:nil];
vc.navigationItem.backBarButtonItem = backButton;
} error:&error];
if (error) {
NSLog(@"%s error: %@", __FUNCTION__, error.localizedDescription);
}
}
Використання:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[self class] overrideBackButtonTitle];
return YES;
}
Якщо ви орієнтовані на iOS 13 та новіші версії, ви можете використовувати цей новий API, щоб приховати назву кнопки "назад" у всьому світі .
let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]
UINavigationBar.appearance().standardAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().compactAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().scrollEdgeAppearance.backButtonAppearance = backButtonAppearance
Я боровся з цим, бо мав спеціальний контролер навігації. Мені вдалося видалити текст заднього елемента з усіх контролерів перегляду з цим кодом у моєму користувальницькому класі контролера навігації
override func viewDidLayoutSubviews() {
self.navigationBar.backItem?.title = ""
}
Це видаляє всі заголовки елементів за допомогою цього користувальницького навігаційного контролера.
В iOS 11 ми виявили, що встановлення UIBarButtonItem
тексту / кольору тексту зовнішнього вигляду на дуже мале значення або чіткий колір призведе до зникнення іншого елемента рядка (система вже не вшановує клас елемента UIBarButton, він перетворить його на a _UIModernBarButton
). Також встановлення зміщення зворотнього тексту на екрані призведе до спалаху під час інтерактивного виклику.
Тож ми шипіли addSubView
:
+ (void)load {
if (@available(iOS 11, *)) {
[NSClassFromString(@"_UIBackButtonContainerView") jr_swizzleMethod:@selector(addSubview:) withMethod:@selector(MyiOS11BackButtonNoTextTrick_addSubview:) error:nil];
}
}
- (void)MyiOS11BackButtonNoTextTrick_addSubview:(UIView *)view {
view.alpha = 0;
if ([view isKindOfClass:[UIButton class]]) {
UIButton *button = (id)view;
[button setTitle:@" " forState:UIControlStateNormal];
}
[self MyiOS11BackButtonNoTextTrick_addSubview:view];
}
-(void)setNavigationItems{
UIBarButtonItem *leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"**Your title here**" style:UIBarButtonItemStyleBordered target:self action:@selector(backButtonClicked)];
self.navigationController.navigationBar.topItem.backBarButtonItem=leftBarButtonItem;
}
-(void)backButtonClicked{
[self.navigationController popViewControllerAnimated:YES];
}
Задній текст надходить з останнього контролера View navigationItem.title
, і navigationItem.title
автоматично встановлюється self.title
. Таким простим способом вирішити проблему є гачок setTitle:
, переконайтесьnavigationItem.title = @""
Помістіть цей код, AppDelegate.m
це зробить це нормально
[UIViewController aspect_hookSelector:@selector(setTitle:)
withOptions:AspectPositionAfter
usingBlock:^(id<AspectInfo> aspectInfo, NSString *title) {
UIViewController *vc = aspectInfo.instance;
vc.navigationItem.titleView = ({
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
titleLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
titleLabel.text = title;
titleLabel;
});
vc.navigationItem.title = @"";
} error:NULL];
Детальніше на https://www.jianshu.com/p/071bc50f1475(Простий китайський)
Моє рішення: - XCode: 10.2.1 - Swift: 5
XCode 11.5 Swift 5
Дуже простий - хоч, можливо, трохи гакітний - це зробити програмно, якщо вам не потрібна спеціальна кнопка "Назад", - встановити розмір шрифту рівний нулю в контролері перегляду, який ви натискаєте на стек, викликаючи щось подібне з viewDidLoad
private func setupNavBar() {
let appearance = UINavigationBarAppearance()
appearance.configureWithDefaultBackground()
let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [.font: UIFont(name: "Arial", size: 0)!]
appearance.backButtonAppearance = backButtonAppearance
navigationItem.standardAppearance = appearance
navigationItem.scrollEdgeAppearance = appearance
navigationItem.compactAppearance = appearance
}
Нарешті знайдено ідеальне рішення для приховування зворотного тексту за замовчуванням у цілій програмі.
Просто додайте одне прозоре зображення та додайте наступний код у свій AppDelegate.
UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
Наступний метод працює на iOS 11 і безпечний, щоб не виходити з ладу на інших версіях iOS. Це може призвести до відхилення вашої програми в огляді App Store, оскільки і UIModernBarButton, і UIBackButtonContainerView є приватними API. Місце в AppDelegate.
if
let UIModernBarButton = NSClassFromString("_UIModernBarButton") as? UIButton.Type,
let UIBackButtonContainerView = NSClassFromString("_UIBackButtonContainerView") as? UIView.Type {
let backButton = UIModernBarButton.appearance(whenContainedInInstancesOf: [UIBackButtonContainerView.self])
backButton.setTitleColor(.clear, for: .normal)
}
Швидка версія, ідеально працює в усьому світі:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Normal)
UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Highlighted)
return true
}
solution
. Як @limfinity вказував, це змінить його повсюдно для всіх програм UIBarButtonItem у всьому додатку