Как установить кернинг (расстояние между символами) в заголовке UINavigationBar - Swift или Objective-C

У меня есть мой навигационный бар, в основном настроенный по моему вкусу, но я пытаюсь увеличить кернинг с помощью NSKernAttributeName. Я использую прокси-сервер внешнего вида, чтобы установить навигационную панель в белый текст и собственный шрифт, но когда я пытаюсь добавить кернинг, он не вступает в силу.

[[UINavigationBar appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
                                                     [UIColor whiteColor], NSForegroundColorAttributeName,
                                                     [UIFont fontWithName:@"HelveticaNeue-Light" size:20.0], NSFontAttributeName,
                                                     [NSNumber numberWithFloat:2.0], NSKernAttributeName, nil]];

Нужно ли мне что-то делать, чтобы добавить некоторые из менее распространенных атрибутов, таких как кернинг, на ярлык заголовка?

Ответы

Ответ 1

В соответствии с документацией, titleTextAttributes of UINavigationBar позволяет вам указать шрифт, цвет текста, цвет текста и теневое смещение текста.

Если вы хотите использовать другие атрибуты, вы можете создать UILabel с нужным NSAttributedString и установить его как titleView для своего контроллера navigationItem

Например:

UILabel *titleLabel = [UILabel new];
NSDictionary *attributes = @{NSForegroundColorAttributeName: [UIColor whiteColor],
                             NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue-Light" size:20.0],
                             NSKernAttributeName: @2};
titleLabel.attributedText = [[NSAttributedString alloc] initWithString:self.navigationItem.title attributes:attributes];
[titleLabel sizeToFit];
self.navigationItem.titleView = titleLabel;

Ответ 2

Я пробовал много разных способов сделать это и обнаружил, что вы можете изменить шрифт, цвет текста, цвет теневого текста и смещение тени текста в UINavigationBar, как сказал выше, описанный выше, как сказал Хесус А. Альварес.

Я преобразовал код в Swift, и он работает:

let titleLabel = UILabel()

let attributes: NSDictionary = [
    NSFontAttributeName:UIFont(name: "HelveticaNeue-Light", size: 20),
    NSForegroundColorAttributeName:UIColor.whiteColor(),
    NSKernAttributeName:CGFloat(2.0)
]

let attributedTitle = NSAttributedString(string: "UINavigationBar Title", attributes: attributes as? [String : AnyObject])

titleLabel.attributedText = attributedTitle
titleLabel.sizeToFit()
self.navigationItem.titleView = titleLabel

Ответ 3

Расширение UIViewController

Я преобразовал вышеупомянутые ответы в расширение UIViewController, чтобы убрать его.

Swift 3

extension UIViewController {
    func setUpCustomTitleView(kerning: CGFloat) {

        let titleLabel = UILabel()

        guard let customFont = UIFont(name: "Montserrat-SemiBold", size: 18) else { return }

        let attributes = [NSForegroundColorAttributeName: UIColor.gray,
                      NSFontAttributeName: customFont,
                      NSKernAttributeName: kerning] as [String : Any]

        guard let title = title else { return }

        let attributedTitle = NSAttributedString(string: title, attributes: attributes)

        titleLabel.attributedText = attributedTitle
        titleLabel.sizeToFit()
        navigationItem.titleView = titleLabel
    }
}

Вызвать функцию расширения из viewDidLoad() вашего контроллера вида.

setUpCustomTitleView(kerning: 2.0)