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

Пользовательский обратный индикатор и iOS 11

Я использую пользовательскую кнопку возврата в своем приложении. Эта пользовательская кнопка возврата настроена глобально следующим образом:

    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)

Обратите внимание, что заголовок кнопки назад, который вы видите в контроллере представления, установлен в предыдущем в стеке навигации.

4b9b3361

Ответ 1

1) удалите PositionAdjustment, если они есть. таких как

  bap.setBackButtonTitlePositionAdjustment(UIOffset(horizontal: 0, vertical: -64), for: .default)

2) проверьте, имеет ли предыдущий ViewController в стеке навигатора заголовок

Ответ 2

Я думаю, что этот метод в порядке! Это полезно для меня.

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];
}

Ответ 3

Для тех, кто не смог его решить:

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, выше кода мы использовали, чтобы скрывать названия кнопок, перемещая назад кнопку вместе с самим заголовком. Однако, если вы просто перемещаете заголовок кнопки "назад" по горизонтали, все работает отлично, и нет никаких обратных ссылок.

Ответ 4

После нескольких попыток и сбоев это сработало для нас для iOS 11:

[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-200, -5) forBarMetrics:UIBarMetricsDefault];

Трюк состоял в том, чтобы переместить текст "Назад" на оси x довольно много назад, а бит на оси y, поскольку setBackButtonTitlePositionAdjustment оказал влияние как на изображение, так и на текст.

Однако мы не знаем, как долго это решение будет работать, оно может быть "исправлено" Apple в любое время

Ответ 5

Я бы порекомендовал метод 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

Ответ 6

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];
}];

Ответ 7

Это решение работает для меня для 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)
    }

Ответ 8

ДЛЯ SWIFT 3 +

     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)
        }