web-dev-qa-db-ja.com

UILabelの文字間隔を変更するにはどうすればよいですか?

UIKitUILabelの数字の間隔を変更して、等しくなるようにします。

標準の間隔では、ラベルは次のようになります。

label with uneven character spacing

次のようになりたいです。

label with even character spacing

どうすればこれを達成できますか?

15
Ben Thomas

属性文字列NSKernAttributeName属性を使用できます。

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];
22
J2K

最も簡単な方法は、カスタムUILabelクラスを作成し、Storyboardから文字間隔を設定することです。

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
        }

    }
}

enter image description here

17
miOS

NSAttributedStringを使用して、NSKernAttributeName属性を操作できます。このデフォルト値は0なので、負の数に設定する必要があります。

https://developer.Apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSAttributedString_Class/#//Apple_ref/doc/constant_group/Character_Attributes

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;

in 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
6
Joel Nieman

NSKernAttributeNameを使用できます。

しかし、他の答えを修正するには:全文の長さに適用せず、(text.length-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];

全文の長さに適用されます。

Applied to full text length.

(テキストの長さ-1)に適用されます。Applied to (text length - 1).

4
jn-se

@ J2Kから回答を取得し、それをSwift 4.2拡張に変換しました。

/// Set the text of the label but altering the kerning so that you can control the space between each characters.
///
/// - Parameters:
///   - text: New content of the label
///   - kerning: Set a value between 0 and 1 to lower the space between characters. Above 0, spacing will be increased. 0 disables kerning.
extension UILabel {

    func set(text: String, withKerning kerning: CGFloat) {
        let attributedString = NSMutableAttributedString(string: text)

        // The value parameter 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.count.
        attributedString.addAttribute(NSAttributedString.Key.kern, value: kerning, range: NSMakeRange(0, text.count))

        attributedText = attributedString
    }

}
3
Pomme2Poule

何も変更せずにInterface BuilderのすべてのUILabelsに文字間隔属性を適用する場合(特定のフォントの場合):

スイフト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
        }
    }
}
2
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

1
emotality

これを試して。単純なテキストまたは属性付きテキストを設定して、割り当てる文字間隔を追加します。 https://stackoverflow.com/a/49929848/45598

0
Umair

ラベルをクリックして、属性インスペクターに移動します。テキストをプレーンから属性付きに変更します。間隔のオプションがいくつかあります。お役に立てれば。

0
Kayamba Mukanzu