Ответ 1
1) удалите PositionAdjustment, если они есть. таких как
bap.setBackButtonTitlePositionAdjustment(UIOffset(horizontal: 0, vertical: -64), for: .default)
2) проверьте, имеет ли предыдущий ViewController в стеке навигатора заголовок
Я использую пользовательскую кнопку возврата в своем приложении. Эта пользовательская кнопка возврата настроена глобально следующим образом:
UINavigationBar.appearance().backIndicatorImage = UIImage(named: "Back").withRenderingMode(.alwaysOriginal)
UINavigationBar.appearance().backIndicatorTransitionMaskImage = UIImage(asset: .back).withRenderingMode(.alwaysOriginal)
Перед iOS 11 этот код сделал трюк, но теперь в iOS 11 кнопка больше не центрирована по вертикали, как вы можете видеть здесь:
Я мог бы изменить высоту обратного изображения кнопки на 44, но это сломало бы его в iOS < 11. Я мог бы также использовать два разных изображения, но я искал что-то более чистое, как способ вертикального центрирования изображения в виде контейнера задней кнопки.
EDIT:
Оказывается, проблема, вызванная banxii1988, вызвана setBackButtonTitlePositionAdjustment
, когда значения намеренно перемещают заголовок за пределы видимого экрана. Это был взлом, чтобы избежать удаления заголовка кнопки в каждом контроллере. Я решил удалить этот хак, и я поступил правильно:
" "
.backBarButtonItem
программно
navigationItem.backBarButtonItem = UIBarButtonItem(title: "",
style: .plain, target: nil, action: nil)
Обратите внимание, что заголовок кнопки назад, который вы видите в контроллере представления, установлен в предыдущем в стеке навигации.
1) удалите PositionAdjustment, если они есть. таких как
bap.setBackButtonTitlePositionAdjustment(UIOffset(horizontal: 0, vertical: -64), for: .default)
2) проверьте, имеет ли предыдущий ViewController в стеке навигатора заголовок
Я думаю, что этот метод в порядке! Это полезно для меня.
if(@available(iOS 11, *)) {
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal];
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateHighlighted];
} else {
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-60, -60) forBarMetrics:UIBarMetricsDefault];
}
Для тех, кто не смог его решить:
1) Поиск в вашем проекте (cmd + shift + f) для "setBackButtonTitle", вы найдете код, как показано ниже:
[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[xController class]]] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];
2) Измените код выше с помощью этого:
[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[xController class]]] setBackButtonTitlePositionAdjustment:UIOffsetMake(-200, 0) forBarMetrics:UIBarMetricsDefault];
Начиная с iOS 11, выше кода мы использовали, чтобы скрывать названия кнопок, перемещая назад кнопку вместе с самим заголовком. Однако, если вы просто перемещаете заголовок кнопки "назад" по горизонтали, все работает отлично, и нет никаких обратных ссылок.
После нескольких попыток и сбоев это сработало для нас для iOS 11:
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-200, -5) forBarMetrics:UIBarMetricsDefault];
Трюк состоял в том, чтобы переместить текст "Назад" на оси x довольно много назад, а бит на оси y, поскольку setBackButtonTitlePositionAdjustment
оказал влияние как на изображение, так и на текст.
Однако мы не знаем, как долго это решение будет работать, оно может быть "исправлено" Apple в любое время
Я бы порекомендовал метод swizzling для его решения, я использовал это решение в некоторых своих проектах, и он отлично работает.
1 - создать категорию UIViewController
.
2- import #import <objc/runtime.h>
.
3- вставьте следующий метод
#import "UIViewController+Extras.h"
#import <objc/runtime.h>
@implementation UIViewController (Extras)
+ (void)load {
static dispatch_once_t once_token;
dispatch_once(&once_token, ^{
SEL viewDidLoadSelector = @selector(viewDidLoad);
SEL viewDidLoadModifyBackButtonSelector = @selector(modifyBackButton_viewDidLoad);
Method originalMethod = class_getInstanceMethod(self, viewDidLoadSelector);
Method extendedMethod = class_getInstanceMethod(self, viewDidLoadModifyBackButtonSelector);
method_exchangeImplementations(originalMethod, extendedMethod);
});
}
- (void)modifyBackButton_viewDidLoad {
[self modifyBackButton_viewDidLoad];
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil];
}
@end
if(@available(iOS 11, *)) {
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal];
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateHighlighted];
} else {
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-60, -60) forBarMetrics:UIBarMetricsDefault];
}
Вышеупомянутое решение от @Tonin работает, но единственная проблема заключается в том, что текст кнопки навигации в навигационной панели (например, "Отмена" ) прозрачен (прозрачный цвет) при совместном использовании с другим приложением (электронная почта, сообщение и т.д.), при необходимости переворачивает цвет share:
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[title, URL] applicationActivities:nil];
[activityViewController setCompletionWithItemsHandler:^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) {
// set clear color when back from share
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal];
}];
[self presentViewController:activityViewController animated:YES completion:^{
// set white color when share to other app
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]} forState:UIControlStateNormal];
}];
Это решение работает для меня для iOS 9, 10 и 11
var backButtonImage: UIImage = UIImage(named: "backButton")!
UINavigationBar.appearance().backIndicatorImage = backButtonImage
UINavigationBar.appearance().backIndicatorTransitionMaskImage = backButtonImage
if #available(iOS 11, *) {
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-300, 0), for:UIBarMetrics.default)
} else {
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -200), for:UIBarMetrics.default)
}
if #available(iOS 11, *) {
UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .highlighted)
} else {
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0,
-60), for:UIBarMetrics.default)
}