Как изменить интервал между буквами в UILabel?
8 ответов
можно использовать на приписанной строки:
UILabel *label = [UILabel new];
NSMutableAttributedString *text = [[NSMutableAttributedString alloc] 
                                   initWithString:@"127"];
// The value paramenter defines your spacing amount, and range is 
// the range of characters in your string the spacing will apply to. 
// Here we want it to apply to the whole string so we take it from 0 to text.length.
[text addAttribute:NSKernAttributeName 
             value:@-0.5 
             range:NSMakeRange(0, text.length)];
[label setAttributedText:text];
самый простой способ-создать пользовательский класс UILabel и установить интервал между буквами из раскадровки.
open class CustomLabel : UILabel {
    @IBInspectable open var characterSpacing:CGFloat = 1 {
        didSet {
            let attributedString = NSMutableAttributedString(string: self.text!)
            attributedString.addAttribute(NSKernAttributeName, value: self.characterSpacing, range: NSRange(location: 0, length: attributedString.length))
            self.attributedText = attributedString
        }
    }
}
Вы можете использовать NSAttributedString и играть с атрибутом nskernattributename. Значение по умолчанию для этого равно 0, поэтому вы хотите установить отрицательное число.
в Obj-C вы можете сделать что-то вроде этого:
NSMutableAttributedString* attrStr = [[NSMutableAttributedString alloc]initWithString: @"Test test test test "];
[attrStr addAttribute:NSKernAttributeName value:@(4.0) range:NSMakeRange(0, attrStr.length)];
label.attributedText = attrStr;
в Swift вы можете сделать что-то вроде это:
let myTitle = "my title"
let titleLabel = UILabel()
let attributes: NSDictionary = [
    NSFontAttributeName:UIFont(name: "FONT_NAME", size: TEXT_SIZE),
    NSKernAttributeName:CGFloat(2.0)
]
let attributedTitle = NSAttributedString(string: myTitle, attributes:attributes as? [String : AnyObject])
titleLabel.attributedText = attributedTitle
на NSKernAttributeName можно использовать.
но в исправлении к другим ответам: не применяется к полной длине текста, но (текст.длина - 1).
отрицательный или положительный интервал добавляется к букве, и это не требуется для последнего. Предположим, вы добавите положительный интервал, который окажется в интервале после последней буквы. Центрированная строка больше не будет казаться центрированной. То же самое относится и к негативным расстояние.
NSString *text = @"Sample Text";    
UILabel *label = [UILabel new]
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString: text];
[attributedString addAttribute:NSKernAttributeName value:[NSNumber numberWithDouble:-1.0] range:NSMakeRange(0, text.length-1)];
[label setAttributedTitle:attributedString forState:UIControlStateNormal];
применяется к полнотекстовой длине.
NSString *myString = @"127";
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:myString];
float letterSpacing = -1.50f; // change spacing here
[attributedString addAttribute:NSKernAttributeName value:@(letterSpacing) range:NSMakeRange(0, [myString length])];
[myLabel setAttributedText:attributedString];
Также см. Это для получения дополнительной информации и результатов:http://www.devsign.co/notes/tracking-and-character-spacing
Если вы хотите применить атрибут интервала между буквами ко всем UILabels в Interface Builder без изменения чего-либо (для конкретного шрифта):
Swift 4:
/**
 * Applies letter spacing to selected fonts in UILabels from IB.
 *
 * - author Alexander Volkov
 * - version 1.0
 */
extension UILabel {
    /// Applies letter spacing
    open override func awakeFromNib() {
        super.awakeFromNib()
        applyLetterSpacing()
    }
    /// Applies letter spacing
    ///
    /// - Parameter aDecoder: the decoder
    /// - Returns: UILabel instance
    open override func awakeAfter(using aDecoder: NSCoder) -> Any? {
        let label = super.awakeAfter(using: aDecoder)
        self.applyLetterSpacing()
        return label
    }
    /// Applies letter spacing
    func applyLetterSpacing() {
        if font.fontName.contains("Oswald", caseSensitive: false) {
            let characterSpacing: CGFloat = 1
            let string = NSMutableAttributedString(string: self.text!)
            string.addAttribute(.kern, value: characterSpacing, range: NSRange(location: 0, length: string.length - 1))
            self.attributedText = string
        }
    }
}
нажмите на метку и перейдите к инспектору атрибутов. Изменить текст с простого на атрибутивный. У вас будет несколько вариантов интервалов. Надеюсь, это поможет.
попробуйте это. Он добавит интервал символов, который вы назначаете, либо вы установите простой текст, либо приписанный текст. https://stackoverflow.com/a/49929848/4559803
 
            



