iOS中的字母间距

问题描述 投票:16回答:3

我有以下代码:

[[cancelButton titleLabel] setFont:[UIFont fontWithName:@"ProximaNova-Regular" size:15]];

我如何设置字母间距?

ios objective-c uilabel uifont
3个回答
53
投票

您无法在摘要中更改字母间距,这意味着您无法在iOS 5及更低版本下更改它。

从iOS 6开始,您可以将属性字符串而不是香草字符串推送到UILabel。推送属性字符串的过程与推送普通字符串的过程略有不同 - 字体,文本颜色和一堆其他属性都在字符串而不是标签上设置。原因是属性字符串允许为字符串的不同区域设置不同的属性。因此,您可以设置一个组合多种字体,文本颜色等的字符串。

支持的核心文本属性之一是kCTKernAttributeName,从iOS 6开始,通过UIKit添加NSKernAttributeName更容易利用。您可以使用字距调整来调整字形的水平间距。

在iOS 5及更早版本中,您曾经需要在Core Foundation C风格的对象和Objective-C UIKit对象之间来回做很多心理跳跃。从6开始,不再需要了。但要小心,如果你在网上搜索事情在6岁以下变得更容易 - 如果你看到很多__bridge演员和手动CFReleases那么你可能正在寻找旧代码。

无论如何,假设你现在有类似的东西:

UILabel *label = [cancelButton titleLabel];

UIFont *font = <whatever>;
UIColor *textColour = <whatever>;
NSString *string = <whatever>;

label.text = string;
label.font = font;
label.textColor = textColour;

你会做更像的事情:

NSAttributedString *attributedString = 
    [[NSAttributedString alloc]
          initWithString:string
          attributes:
              @{
                    NSFontAttributeName : font,
                    NSForegroundColorAttributeName : textColour
              }];

label.attributedText = attributedString;

在您的情况下,还要调整您添加的整体字距:

NSAttributedString *attributedString = 
    [[NSAttributedString alloc]
          initWithString:string
          attributes:
              @{
                    NSFontAttributeName : font,
                    NSForegroundColorAttributeName : textColour,
                    NSKernAttributeName : @(-1.3f)
              }];

label.attributedText = attributedString;

或者您想要应用的任何字距调整值。请参阅NSAttributedString UIKit Additions Reference底部的各种常量,了解您可以应用的各种其他属性以及它们最初可用的iOS版本。

很久以后的补遗:虽然仍然是你遇到过的人数最少的人之一,但我认为这与Swift相当:

button.titleLabel?.attributedText =
    NSAttributedString(
        string: string,
        attributes:
        [
            NSFontAttributeName: font,
            NSForegroundColorAttributeName: textColour,
            NSKernAttributeName: -1.3
        ])

1
投票

其中一个受支持的Core Text属性是kCTKernAttributeName,从iOS 6开始,通过UIKit添加NSKernAttributeName更容易利用它。您可以使用字距调整来调整字形的水平间距。

字距调整是两个独特字母之间的空间调整。字距在不同的字符对之间有所不同。例如,像'AVA'这样的组合在字符之间会有类似于'VVV'的字符串。

通过使用NSKernAttributeName,您实际上覆盖了内置到字体文件中的自定义空间调整,将所有各种字符对kern值设置为相同的数字,从而打破了最佳字距调整。当应用于整个文本字符串时,少量的断开间距的字距更加明显。但是,高字距值可能会使字母间隔足够远,以至于差距不会明显。

您正在寻找的是跟踪(又名字母间距),它是给定文本块中所有字母之间的间距。不幸的是,iOS似乎不允许您控制该属性。


1
投票
    NSAttributedString *cancelButtonAttributedString =[[NSAttributedString alloc]
                                           initWithString:@"Hello"
                                           attributes:
                                           @{
                                             NSKernAttributeName : @(1.5)
                                             }];
    [cancelButton setAttributedTitle:bittonAttributedString forState:UIControlStateNormal];

这只是上述问题的简单答案

© www.soinside.com 2019 - 2024. All rights reserved.