17

我的导航栏大部分是根据自己的喜好定制的,但我正在尝试使用NSKernAttributeName. 我正在使用外观代理将导航​​栏设置为白色文本和自定义字体,但是当我尝试添加字距调整时,它不会生效。

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

我是否需要做一些其他事情来将一些不太常见的属性(如字距调整)添加到标题标签?

4

4 回答 4

41

根据文档,titleTextAttributesofUINavigationBar仅允许您指定字体、文本颜色、文本阴影颜色和文本阴影偏移量。

如果你想使用其他属性,你可以创建一个你想要UILabelNSAttributedString,并将它设置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;
于 2013-12-01T10:59:09.207 回答
8

我尝试了许多不同的方法来完成此操作,发现您只能更改 UINavigationBar 的字体、文本颜色、文本阴影颜色和文本阴影偏移量,就像上面@Jesús A. Alvarez 所说的那样。

我已经在 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
于 2015-11-17T00:16:52.957 回答
3

以上答案已针对Swift 4更新

我创建了一个超类,在其中定义了这个方法,你可以从你想要的每个子类中调用它:

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
}
于 2018-02-20T19:15:07.613 回答
0

UIViewController 扩展

我将上面的答案转换为 UIViewController 扩展来整理它。

斯威夫特 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) 
于 2017-08-03T22:06:37.343 回答