Pregunta Cómo establecer el kerning (espaciado entre caracteres) en el título UINavigationBar - Swift u Objective-C


Tengo mi barra de navegación personalizada en su mayoría a mi gusto, pero estoy tratando de aumentar el kerning usando NSKernAttributeName. Estoy usando el proxy de apariencia para configurar la barra de navegación en texto blanco y una fuente personalizada, pero cuando intento agregar interletraje, no tiene efecto.

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

¿Debo hacer algo más para agregar algunos de los atributos menos comunes como el kerning a la etiqueta del título?


15
2017-12-01 10:00


origen


Respuestas:


De acuerdo con la documentación, el titleTextAttributes de UINavigationBar solo le permite especificar la fuente, el color del texto, el color de sombra del texto y el desplazamiento de sombra del texto.

Si desea usar otros atributos, puede crear un UILabel con el NSAttributedString lo desea, y configúrelo como el titleView para su controlador navigationItem

Por ejemplo:

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;

38
2017-12-01 10:59



He intentado muchas formas diferentes de lograr esto y descubrí que solo puedes cambiar la fuente, el color del texto, el color de sombra del texto y el sombreado de texto de UINavigationBar, como dijo @ Jesús A. Álvarez.

He convertido el código en Swift y funciona:

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

8
2017-11-17 00:16



Sobre la respuesta actualizada para Swift 4 

Creé una superclase, donde definí este método, al que puedes llamar desde cada subclase que quieras:

func setNavigationTitle(_ title: String, kern: CGFloat) {
    let titleLabel = UILabel()

    let attributes = [
        NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: 18),
        NSAttributedStringKey.foregroundColor: UIColor.white,
        NSAttributedStringKey.kern: kern] as [NSAttributedStringKey : Any]

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

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

1
2018-02-20 19:15



Extensión UIViewController

Convertí las respuestas anteriores en una extensión UIViewController para ponerlo en orden.

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

Llame a la función de extensión desde viewDidLoad () de su controlador de vista.

setUpCustomTitleView(kerning: 2.0) 

0
2017-08-03 22:06