SwiftのUILabelで行間隔を増やす方法


94

テキストの行数が少ないラベルがあり、行間の間隔を広げたいです。他の人からも同様の質問がありますが、解決策では私の問題は解決しません。また、私のラベルには段落が含まれる場合と含まれない場合があります。私は初めてSwiftです。ストーリーボードを使用した解決策はありますか?それともNSAttributedStringその可能性を通してのみ?

回答:


175

UILabel次のスニペットを使用して、プログラムでLineSpacingをに追加します。

以前のSwiftバージョン

let attributedString = NSMutableAttributedString(string: "Your text")

// *** Create instance of `NSMutableParagraphStyle`
let paragraphStyle = NSMutableParagraphStyle()

// *** set LineSpacing property in points ***
paragraphStyle.lineSpacing = 2 // Whatever line spacing you want in points

// *** Apply attribute to string ***
attributedString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

// *** Set Attributed String to your label ***
label.attributedText = attributedString

Swift 4.0

let attributedString = NSMutableAttributedString(string: "Your text")

// *** Create instance of `NSMutableParagraphStyle`
let paragraphStyle = NSMutableParagraphStyle()

// *** set LineSpacing property in points ***
paragraphStyle.lineSpacing = 2 // Whatever line spacing you want in points

// *** Apply attribute to string ***
attributedString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

// *** Set Attributed String to your label ***
label.attributedText = attributedString

Swift 4.2

let attributedString = NSMutableAttributedString(string: "Your text")

// *** Create instance of `NSMutableParagraphStyle`
let paragraphStyle = NSMutableParagraphStyle()

// *** set LineSpacing property in points ***
paragraphStyle.lineSpacing = 2 // Whatever line spacing you want in points

// *** Apply attribute to string ***
attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

// *** Set Attributed String to your label ***
label.attributedText = attributedString

3
これは、「タイプ 'NSAttributedString'の値にメンバー 'addAttribute'がありません」というエラーを示しています。
スネハ2016

2
NSMutableAttributedString代わりにを使用する必要がありますNSAttributedString。asnwerを更新しました。
Dipen Panchasara 2016

1
カスタムフォントを使用する@Dipen Panchasara
Abdul Karim

7
理由はわかりませんが、私に関しては、これは行間隔> = 1を設定した場合にのみ機能し、0.5 / 0.75を設定しようとしましたが、効果はありません
Aximem 2017

2
の必要はありませんNSMutableAttributedString。使用することができますNSAttributedString(string: "Your text", attributes: [NSAttributedString.Key.paragraphStyle : paragraphStyle])
bauerMusic

101

Interface Builderから:

ここに画像の説明を入力してください

プログラムで:

SWift 4&4.2

ラベル拡張子の使用

extension UILabel {

    func setLineSpacing(lineSpacing: CGFloat = 0.0, lineHeightMultiple: CGFloat = 0.0) {

        guard let labelText = self.text else { return }

        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = lineSpacing
        paragraphStyle.lineHeightMultiple = lineHeightMultiple

        let attributedString:NSMutableAttributedString
        if let labelattributedText = self.attributedText {
            attributedString = NSMutableAttributedString(attributedString: labelattributedText)
        } else {
            attributedString = NSMutableAttributedString(string: labelText)
        }

        // (Swift 4.2 and above) Line spacing attribute
        attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))


        // (Swift 4.1 and 4.0) Line spacing attribute
        attributedString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

        self.attributedText = attributedString
    }
}

拡張関数を呼び出す

let label = UILabel()
let stringValue = "Set\nUILabel\nline\nspacing"

// Pass value for any one argument - lineSpacing or lineHeightMultiple
label.setLineSpacing(lineSpacing: 2.0) .  // try values 1.0 to 5.0

// or try lineHeightMultiple
//label.setLineSpacing(lineHeightMultiple = 2.0) // try values 0.5 to 2.0

または、ラベルインスタンスを使用します(結果を確認するには、このコードをコピーして実行するだけです)

let label = UILabel()
let stringValue = "Set\nUILabel\nline\nspacing"
let attrString = NSMutableAttributedString(string: stringValue)
var style = NSMutableParagraphStyle()
style.lineSpacing = 24 // change line spacing between paragraph like 36 or 48
style.minimumLineHeight = 20 // change line spacing between each line like 30 or 40

// Line spacing attribute
attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value: style, range: NSRange(location: 0, length: stringValue.characters.count))

// Character spacing attribute
attrString.addAttribute(NSAttributedStringKey.kern, value: 2, range: NSMakeRange(0, attrString.length))

label.attributedText = attrString

スウィフト3

let label = UILabel()
let stringValue = "Set\nUILabel\nline\nspacing"
let attrString = NSMutableAttributedString(string: stringValue)
var style = NSMutableParagraphStyle()
style.lineSpacing = 24 // change line spacing between paragraph like 36 or 48
style.minimumLineHeight = 20 // change line spacing between each line like 30 or 40
attrString.addAttribute(NSParagraphStyleAttributeName, value: style, range: NSRange(location: 0, length: stringValue.characters.count))
label.attributedText = attrString

「NSAttributedStringKey.paragraphStyle」でエラーが発生したため、代わりに「NSParagraphStyleAttributeName」を使用しました。
アフマドレザ2018

@ Alfi-Swift言語バージョンの違いです。あなたのプロジェクトの迅速な言語。バージョンはswift3.xである可能性があり、ここに両方の​​バージョンの回答があります。Swift3コードで試してください。
krunal 2018

Hii @krunal、インターフェイスでLinespacingとLineHeightを設定し、UILabelでプログラムでテキストを設定しましたが、機能しません。インターフェイスにテキストを追加すると、機能します。このありがとうございます。UILabelにattributedTextとtextも設定しましたが、そのアプローチはうまくいきません。
YogeshPatel19年

Interface Builderソリューションは、静的テキスト専用です。コードに属性文字列を追加する場合、InterfaceBuilderから追加された属性は適用されません。
よだがま

66

で行間隔を制御できstoryboardます。

ここに画像の説明を入力してください

同じ質問。


8
私は実際にこれを試しました。しかし、それは機能していません。また、これはカスタムフォントには役立ちません。
スネハ2016

カスタムフォントの位置がずれている場合は、ここに記載さascenderれているようにプロパティを更新してみてください
pkc456 2016

1
ミスアライメントの問題ではありません。私は解決策と私のカスタムフォントを選択することはできません、あなたが言った@ pkc456
スネハ

ミスアライメントの問題ではありません。カスタムフォントを選択できませんでしたが、Attributedの設定でフォントを個別に追加することで解決しました。しかし、まだ間隔が同じまま@ pkc456。
スネハ

15
これは静的テキスト専用です。プログラムでテキストを追加してみてください。これは機能しません。
スネハ2016

11

Swift5.0の最近のソリューション

private extension UILabel {

    // MARK: - spacingValue is spacing that you need
    func addInterlineSpacing(spacingValue: CGFloat = 2) {

        // MARK: - Check if there's any text
        guard let textString = text else { return }

        // MARK: - Create "NSMutableAttributedString" with your text
        let attributedString = NSMutableAttributedString(string: textString)

        // MARK: - Create instance of "NSMutableParagraphStyle"
        let paragraphStyle = NSMutableParagraphStyle()

        // MARK: - Actually adding spacing we need to ParagraphStyle
        paragraphStyle.lineSpacing = spacingValue

        // MARK: - Adding ParagraphStyle to your attributed String
        attributedString.addAttribute(
            .paragraphStyle,
            value: paragraphStyle,
            range: NSRange(location: 0, length: attributedString.length
        ))

        // MARK: - Assign string that you've modified to current attributed Text
        attributedText = attributedString
    }

}

そして使用法:

let yourLabel = UILabel()
let yourText = "Hello \n world \n !"
yourLabel.text = yourText
yourLabel.addInterlineSpacing(spacingValue: 1.5)

もちろん、これは使用UILabel.textしていない場合にのみ機能しますUILabel.attributedText
Jeroen

9

この再利用可能な拡張機能を使用できます。

extension String {

func lineSpaced(_ spacing: CGFloat) -> NSAttributedString {
    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.lineSpacing = spacing
    let attributedString = NSAttributedString(string: self, attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle])
    return attributedString
}
}

5

Swift4およびSwift5

extension NSAttributedString {
    func withLineSpacing(_ spacing: CGFloat) -> NSAttributedString {


        let attributedString = NSMutableAttributedString(attributedString: self)
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineBreakMode = .byTruncatingTail
        paragraphStyle.lineSpacing = spacing
        attributedString.addAttribute(.paragraphStyle,
                                      value: paragraphStyle,
                                      range: NSRange(location: 0, length: string.count))
        return NSAttributedString(attributedString: attributedString)
    }
}

使い方

    let example = NSAttributedString(string: "This is Line 1 \nLine 2 \nLine 3 ").withLineSpacing(15)
    testLabel.attributedText = example

例


素晴らしい!私の時間を節約しました!
Codetard

4

Swift4のDipenの回答が更新されました

let attr = NSMutableAttributedString(string: today)
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 2
attr.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSMakeRange(0, attr.length))
label.attributedText = attr;

1
//Swift 4:
    func set(text:String,
                         inLabel:UILabel,
                         withLineSpacing:CGFloat,
                         alignment:NSTextAlignment){
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.lineSpacing = withLineSpacing
            let attrString = NSMutableAttributedString(string: text)
            attrString.addAttribute(NSAttributedStringKey.paragraphStyle,
                                    value:paragraphStyle,
                                    range:NSMakeRange(0, attrString.length))
            inLabel.attributedText = attrString
            inLabel.textAlignment = alignment
          }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.