วิธีควบคุมระยะห่างบรรทัดใน UILabel


274

เป็นไปได้หรือไม่ที่จะลดช่องว่างระหว่างข้อความเมื่อใส่หลายบรรทัดใน a UILabel? เราสามารถกำหนดเฟรมขนาดตัวอักษรและจำนวนบรรทัด ฉันต้องการลดช่องว่างระหว่างสองบรรทัดในป้ายกำกับนั้น



2
ฉันขอแนะนำให้คุณยอมรับหนึ่งในคำตอบที่ถูกต้องสำหรับ iOS 6.0 และใหม่กว่าหรือไม่? คำตอบที่ยอมรับในปัจจุบันล้าสมัย
Mark Amery

สำหรับแต่ละการใช้บรรทัดใหม่แล้วฝังป้ายทั้งหมดในUILabel StackViewสุดท้ายปรับของspacing StackViewจำไว้ว่าให้เรียงมันในแนวตั้ง
น้ำผึ้ง

อ้างถึงลิงค์ต่อไปนี้สำหรับวิธีแก้ปัญหาใน Swift 2. stackoverflow.com/a/39158698/6602495
Sneha

อ้างถึงstackoverflow.com/a/44325650/342794สำหรับการปรับแต่งกระดานเรื่องราวและรายละเอียดอื่น ๆ
lal

คำตอบ:


262

ฉันคิดว่าจะเพิ่มสิ่งใหม่ในคำตอบนี้ดังนั้นฉันจึงไม่รู้สึกแย่ ... นี่คือคำตอบของSwift :

import Cocoa

let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 40

let attrString = NSMutableAttributedString(string: "Swift Answer")
attrString.addAttribute(.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))

var tableViewCell = NSTableCellView()
tableViewCell.textField.attributedStringValue = attrString

"คำตอบสั้น ๆ : คุณทำไม่ได้ในการเปลี่ยนช่องว่างระหว่างบรรทัดของข้อความคุณจะต้อง subclass UILabel และหมุน drawTextInRect ของคุณเองหรือสร้างหลายป้ายกำกับ"

โปรดดู: ตั้งค่าระยะห่างบรรทัด UILabel


นี่เป็นคำตอบที่เก่ามากและคนอื่น ๆ ได้เพิ่มวิธีการใหม่และดีกว่าในการจัดการเรื่องนี้แล้วโปรดดูคำตอบล่าสุดที่ให้ไว้ด้านล่าง


23
ตั้งแต่ iOS 6.0 คุณสามารถควบคุมมันได้ผ่านNSAttributedString(ยังมีอยู่ในคุณสมบัติของ UILable ในตัวสร้างส่วนต่อประสานของ Xcode)
ıɾuǝʞ

13
ที่น่าสนใจเป็นที่อยู่ใกล้กับที่ผมสามารถบอกคุณสามารถเพิ่มระยะห่างระหว่างบรรทัดพิเศษ แต่ไม่ลดความมันผ่านเมื่อใช้NSParagraphStyle NSAttributedString(ฉันอาจต้องทำการทดสอบเพิ่มเติมของคุณสมบัติที่ปรับเปลี่ยนได้อื่น ๆ แต่lineSpacingคุณสมบัติช่วยให้คุณสามารถเพิ่มได้เท่านั้น)
livingtech

ดูคำตอบของฉันเพื่อดูวิธีการใช้ NSAttributedString
d.ennis

2
@livingtech นั่นทำให้โกรธและฉันเชื่อว่าคุณถูกต้อง คุณพบวิธีการแก้ปัญหาหรือไม่?
Dom Vinyard

7
เพียงชี้แจงบางสิ่งบางอย่างในหัวข้อนี้ ถ้าคุณต้องการที่จะหดตัวลงระยะห่างระหว่างบรรทัดที่กำหนดความสูงของสายถึง 1.0 แล้ว setLineHeightMultiple เป็นค่าที่ต่ำกว่า <1.0 เช่น: [paragraphStyle setLineHeightMultiple: 0.8] หรือ paragraphStyle.lineHeightMultiple = 0.8
virsunen

401

ใน Xcode 6 คุณสามารถทำได้ในกระดานเรื่องราว:

ป้อนคำอธิบายรูปภาพที่นี่


1
ใช้ประโยชน์จากกระดานเรื่องราวให้มากขึ้น!
อัลเลน

22
@PaperThick มีปัญหาเดียวกันใน 6.1.1 มัน "ฮาเล็มสั่น" ไม่กี่นาที ไม่ทราบวิธีการแก้ไข :) Xcode Shaking
Anton Gaenko

8
มีวิธีการตั้งค่าแบบอักษรที่กำหนดเองด้วยวิธีนี้หรือไม่? ฉันไม่สามารถเปลี่ยน helvetica neue เป็นแบบอักษรอื่นได้
Marcos Curvello

2
หากคุณเปิดใช้งาน 'Attributed' จากนั้นเปิดไฟล์เป็นซอร์สโค้ดคุณสามารถแก้ไข 'lineHeightMultiple' ด้วยตนเองดังนั้นจึงข้ามข้อผิดพลาด Harlem Shake
ED-209

2
@azdev สำหรับทุกคนที่กำลังมองหาสิ่งนี้อยู่ฉันกำลังเขย่าอีกครั้งใน Xcode 7.3 แต่ฉันคิดว่านี่เป็นรุ่นแรกที่ไม่มีปัญหา
LulzCow

103

เริ่มต้นจาก iOS 6 คุณสามารถตั้งค่าสตริงประกอบเป็น UILabel ตรวจสอบสิ่งต่อไปนี้:

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:label.text];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = spacing;
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, label.text.length)];

label.attributedText = attributedString;

1
attributedStringต้องเป็นNSMutableAttributedString(ไม่ NSAttributedString)
ไมค์ S

14
รหัสบรรทัดแรกควรเป็นNSMutableAttributedString *attributedString = [NSMutableAttributedString alloc]initWithString:@"sample text"];
Allen

lineSpacingทรัพย์สินของผู้NSMutableParagraphStyleไม่เคยลบเพื่อให้ความสูงของบรรทัดไม่สามารถลดลงได้ด้วยวิธีนี้ ในการตอบคำถามคุณต้องใช้คุณสมบัติอื่นดู @ d.ennis answer
ธีโอ

81

การแก้ปัญหาที่ระบุไว้ที่นี่ไม่ได้ผลสำหรับฉัน ฉันพบวิธีแตกต่างกันเล็กน้อยในการทำด้วย iOS 6 NSAttributeString:

myLabel.numberOfLines = 0; 
NSString* string = @"String with line one. \n Line two. \n Line three.";
NSMutableParagraphStyle *style  = [[NSMutableParagraphStyle alloc] init];
style.minimumLineHeight = 30.f;
style.maximumLineHeight = 30.f;
NSDictionary *attributtes = @{NSParagraphStyleAttributeName : style,};
myLabel.attributedText = [[NSAttributedString alloc] initWithString:string
                                                         attributes:attributtes];   
[myLabel sizeToFit];

1
ความสูงของบรรทัดขึ้นอยู่กับขนาดตัวอักษร การเว้นบรรทัดคือการเว้นบรรทัด คุณอาจได้สิ่งต่าง ๆ ออกมาโดยการตั้งค่าความสูงของเส้นต่ำสุด / สูงสุด แต่เพียงเพราะขนาดแบบอักษรปัจจุบันที่คุณใช้ไม่เกินขอบเขตความสูงของบรรทัด ตามเอกสารประกอบ: "... ร่ายมนตร์และกราฟิคที่สูงเกินกว่าความสูงนี้จะทับเส้นข้างเคียง ... แม้ว่าข้อ จำกัด นี้จะใช้กับตัวบรรทัดเอง แต่การเว้นวรรคบรรทัดจะเพิ่มพื้นที่พิเศษระหว่างบรรทัดที่อยู่ติดกัน"
Ari Braginsky

+1, หากคุณต้องการลดระยะห่างระหว่างบรรทัดนี่คือสิ่งที่คุณต้องการทำ การเว้นวรรคบรรทัดจริงมักเป็น 0 โดยค่าเริ่มต้นนี่คือสาเหตุที่ผู้คนรายงานว่าคุณสามารถเพิ่มได้เท่านั้น ปัญหาของการเว้นวรรคที่ใหญ่เกินไปมาจากความสูงของบรรทัดที่ใหญ่เกินไปนี่คือสาเหตุที่ทำให้งานเสร็จ 99% ของเวลา
lawicko

1
นี่เป็นคำตอบเดียวที่ฉันพบว่าใช้ค่าความสูงของเส้นที่แท้จริง (แทนที่จะเป็นอัตราส่วน) ที่ใช้กันทั่วไปในการออกแบบแอปพลิเคชันเช่น Photoshop, Sketch, CSS และอื่น ๆ
Albert Bori

35

ฉันได้สร้างส่วนขยายที่เรียบง่ายซึ่งทำงานได้ดีมากสำหรับฉัน:

extension UILabel {
    func setLineHeight(lineHeight: CGFloat) {
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = 1.0
        paragraphStyle.lineHeightMultiple = lineHeight
        paragraphStyle.alignment = self.textAlignment

        let attrString = NSMutableAttributedString()
        if (self.attributedText != nil) {
            attrString.append( self.attributedText!)
        } else {
            attrString.append( NSMutableAttributedString(string: self.text!))
            attrString.addAttribute(NSAttributedStringKey.font, value: self.font, range: NSMakeRange(0, attrString.length))
        }
        attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
        self.attributedText = attrString
    }
}

คัดลอกไฟล์นี้ในไฟล์ดังนั้นคุณจึงสามารถใช้มันได้เช่นนี้

myLabel.setLineHeight(0.7)

โปรดจำไว้ว่าถ้าคุณทำสิ่งนี้ในขณะที่คุณใช้ Storyboard สำหรับป้ายกำกับนี้ด้วยโปรดแน่ใจว่าได้ตั้งค่าบรรทัดของป้ายกำกับของคุณเป็น 0
Honey

ทำไมคุณไม่เพียงโดยตรงตั้งlineSpacingและลืมเกี่ยวกับการตั้งค่าlineHeightMultiple?
ฮันนี่

เนื่องจากกุญแจสำคัญในการลดความสูงของบรรทัดคือ 'lineHeightMultiple' ไม่มีการเว้นบรรทัด
Agustin Meriles

บอกว่าคุณต้องการความสูงของเส้นเป็น 1.4 ทำไมคุณไม่เขียน.lineSpacing = 1.4และลืมทุกอย่างเกี่ยวกับ.lineHeightMultiple...
ฮันนี่

ฮะ! ฉันพยายามและฉันไม่ทำงาน แต่ฉันสงสัยว่าทำไมฉันไม่เห็นคำตอบอื่น ๆ ที่นี่ไม่ใช้กลไกของคุณฉันหมายถึงพวกเขาเพียงแค่กำหนด lineSpacing โดยตรง ดูคำตอบที่ได้รับการยอมรับ ...
น้ำผึ้ง

33

จากตัวสร้างส่วนต่อประสาน (Storyboard / XIB):

ป้อนคำอธิบายรูปภาพที่นี่

โปรแกรม:

สวิฟต์ 4

การใช้ส่วนขยายฉลาก

extension UILabel {

    // Pass value for any one of both parameters and see result
    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)
        }

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

        self.attributedText = attributedString
    }
}

ตอนนี้เรียกใช้ฟังก์ชันส่วนขยาย

let label = UILabel()
let stringValue = "How to\ncontrol\nthe\nline spacing\nin UILabel"

// 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 = "How to\ncontrol\nthe\nline spacing\nin UILabel"
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 = "How to\ncontrol\nthe\nline spacing\nin UILabel"
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

2
เพิ่มบรรทัด "ย่อหน้าStyle.alignment = self.textAlignment" เพื่อให้การจัดตำแหน่งเดิม มิฉะนั้นข้อความจะถูกจัดชิดซ้าย
Nithin Michael

สำหรับใครก็ตามที่ปล่อยไข่ในข้อความขนาดใหญ่ให้ใช้: ย่อหน้าStyle.lineBreakMode = .byTruncatingTail
christostsang

19

ตอนนี้มีคำตอบอื่นใน iOS 6 ซึ่งเป็นการตั้งค่า ดูคำตอบล้นสแต็คนี้สำหรับรายละเอียดเกี่ยวกับความสูงของบรรทัดด้วย NSAttributedString:

ข้อความหลัก - ความสูงของบรรทัด NSAttributedString ถูกต้องหรือไม่


16

นี่คือคลาสที่คลาสย่อย UILabel มีคุณสมบัติความสูงบรรทัด: https://github.com/LemonCake/MSLabel


ขอบคุณสำหรับสิ่งนี้ ฉันพยายามใช้ MTLabel ด้วย แต่อันนี้ดีกว่า
เดนิส Kutlubaev

1
ไม่มีใครรู้ว่า MSLabel รองรับอักขระ '\ n' หรือไม่
achi

11

ใน Swift และเป็นฟังก์ชั่นแรงบันดาลใจจาก DarkDust

// Usage: setTextWithLineSpacing(myEpicUILabel,text:"Hello",lineSpacing:20)
func setTextWithLineSpacing(label:UILabel,text:String,lineSpacing:CGFloat)
{
    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.lineSpacing = lineSpacing

    let attrString = NSMutableAttributedString(string: text)
    attrString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))

    label.attributedText = attrString
}

7

ตามคำตอบของไมค์ @ การลดlineHeightMultipleจุดสำคัญคือ ตัวอย่างด้านล่างมันใช้งานได้ดีสำหรับฉัน:

    NSString* text = label.text;
    CGFloat textWidth = [text sizeWithAttributes:@{NSFontAttributeName: label.font}].width;
    if (textWidth > label.frame.size.width) {
        NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
        paragraph.alignment = NSTextAlignmentCenter;
        paragraph.lineSpacing = 1.0f;
        paragraph.lineHeightMultiple = 0.75;     // Reduce this value !!!
        NSMutableAttributedString* attrText = [[NSMutableAttributedString alloc] initWithString:text];
        [attrText addAttribute:NSParagraphStyleAttributeName value:paragraph range:NSMakeRange(0, text.length)];
        label.attributedText = attrText;
    }

6

SWIFT 3ส่วนขยายที่มีประโยชน์สำหรับกำหนดพื้นที่ระหว่างบรรทัดได้ง่ายขึ้น :)

extension UILabel
{
    func setLineHeight(lineHeight: CGFloat)
    {
        let text = self.text
        if let text = text 
        {

            let attributeString = NSMutableAttributedString(string: text)
            let style = NSMutableParagraphStyle()

           style.lineSpacing = lineHeight
           attributeString.addAttribute(NSParagraphStyleAttributeName,
                                        value: style,
                                        range: NSMakeRange(0, text.characters.count))

           self.attributedText = attributeString
        }
    }
}

5

ฉันได้พบวิธีที่คุณสามารถตั้งที่ความสูงของบรรทัดจริง (ไม่ได้เป็นปัจจัย) และมันยังทำให้อาศัยอยู่ใน Interface Builder เพียงทำตามคำแนะนำด้านล่าง รหัสถูกเขียนในสวิฟท์ 4


ขั้นตอนที่ # 1:สร้างไฟล์ชื่อDesignableLabel.swiftและใส่รหัสต่อไปนี้:

import UIKit

@IBDesignable
class DesignableLabel: UILabel {
    @IBInspectable var lineHeight: CGFloat = 20 {
        didSet {
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.minimumLineHeight = lineHeight
            paragraphStyle.maximumLineHeight = lineHeight
            paragraphStyle.alignment = self.textAlignment

            let attrString = NSMutableAttributedString(string: text!)
            attrString.addAttribute(NSAttributedStringKey.font, value: font, range: NSRange(location: 0, length: attrString.length))
            attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attrString.length))
            attributedText = attrString
        }
    }
}

ขั้นตอนที่ 2:วางUILabelเป็นสตอรี่บอร์ด / XIB DesignableLabelและตั้งระดับนี้เพื่อ รอให้โครงการของคุณสร้าง (build ต้องสำเร็จ!)

การระบุคลาสให้กับ UILabel ของคุณ


ขั้นตอนที่ 3:ตอนนี้คุณควรเห็นคุณสมบัติใหม่ในบานหน้าต่างคุณสมบัติที่ชื่อว่า "ความสูงของบรรทัด" เพียงแค่ตั้งค่าที่คุณชอบและคุณควรเห็นผลลัพธ์ทันที!

กำหนด Line Height ในคุณสมบัติ


2

นี่คือคลาสย่อยของ UILabel ที่ตั้งค่าlineHeightMultipleและทำให้แน่ใจว่าความสูงที่แท้จริงมีขนาดใหญ่พอที่จะไม่ตัดข้อความ

@IBDesignable
class Label: UILabel {
    override var intrinsicContentSize: CGSize {
        var size = super.intrinsicContentSize
        let padding = (1.0 - lineHeightMultiple) * font.pointSize
        size.height += padding
        return size
    }

    override var text: String? {
        didSet {
            updateAttributedText()
        }
    }

    @IBInspectable var lineHeightMultiple: CGFloat = 1.0 {
        didSet {
            updateAttributedText()
        }
    }

    private func updateAttributedText() {
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineHeightMultiple = lineHeightMultiple
        attributedText = NSAttributedString(string: text ?? "", attributes: [
            .font: font,
            .paragraphStyle: paragraphStyle,
            .foregroundColor: textColor
        ])
        invalidateIntrinsicContentSize()
    }
}

การขยายเสริมต้องเป็น (lineHeightMultiple - 1.0) * font.pointSize ใช่ไหม
Pavel Alexeev

รหัสด้านบนตามที่ดูเหมือนจะใช้ได้สำหรับฉัน แต่บางทีคุณพูดถูก คุณลองเปลี่ยนแปลงไหม? @PavelAlexeev
phatmann

ไม่ฉันติดกับ lineSpacing แทน lineHeightMultiple :)
Pavel Alexeev

1

ใน Swift 2.0 ...

เพิ่มส่วนขยาย:

extension UIView {
    func attributesWithLineHeight(font: String, color: UIColor, fontSize: CGFloat, kern: Double, lineHeightMultiple: CGFloat) -> [String: NSObject] {
        let titleParagraphStyle = NSMutableParagraphStyle()
        titleParagraphStyle.lineHeightMultiple = lineHeightMultiple

        let attribute = [
            NSForegroundColorAttributeName: color,
            NSKernAttributeName: kern,
            NSFontAttributeName : UIFont(name: font, size: fontSize)!,
            NSParagraphStyleAttributeName: titleParagraphStyle
        ]
        return attribute
    }
}

ตอนนี้เพียงแค่ตั้ง UILabel ของคุณเป็นไฟล์ประกอบ

self.label.attributedText = NSMutableAttributedString(string: "SwiftExample", attributes: attributesWithLineHeight("SourceSans-Regular", color: UIColor.whiteColor(), fontSize: 20, kern: 2.0, lineHeightMultiple: 0.5))    

เห็นได้ชัดว่าฉันได้เพิ่มพารามิเตอร์จำนวนมากที่คุณอาจไม่ต้องการ เล่นรอบ - อย่าลังเลที่จะเขียนวิธีใหม่ - ฉันกำลังมองหาสิ่งนี้ในคำตอบที่แตกต่างกันดังนั้นฉันจึงคิดว่าฉันจะโพสต์ส่วนขยายทั้งหมดในกรณีที่มันช่วยให้ใครบางคนอยู่ที่นั่น ... -rab


1

Swift3 - ในส่วนขยาย UITextView หรือ UILabel ให้เพิ่มฟังก์ชันนี้:

ฉันเพิ่มโค้ดบางส่วนเพื่อเก็บข้อความที่เป็นปัจจุบันหากคุณใช้สตริงที่มีการบันทึกพร้อมกับมุมมอง (แทนที่จะเขียนทับพวกเขา)

func setLineHeight(_ lineHeight: CGFloat) {
    guard let text = self.text, let font = self.font else { return }

    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.lineSpacing = 1.0
    paragraphStyle.lineHeightMultiple = lineHeight
    paragraphStyle.alignment = self.textAlignment

    var attrString:NSMutableAttributedString
    if let attributed = self.attributedText {
        attrString = NSMutableAttributedString(attributedString: attributed)
    } else {
        attrString = NSMutableAttributedString(string: text)
        attrString.addAttribute(NSFontAttributeName, value: font, range: NSMakeRange(0, attrString.length))
    }
    attrString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
    self.attributedText = attrString
}

1

คำตอบอื่น ๆ ... หากคุณส่งสตริงโดยทางโปรแกรมคุณจะต้องผ่านสตริงที่เชื่อมโยงแทนสตริงปกติและเปลี่ยนสไตล์ของมัน (iOS10)

NSMutableAttributedString * attrString = [[NSMutableAttributedString alloc] initWithString:@"Your \nregular \nstring"];
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
[style setLineSpacing:4];
[attrString addAttribute:NSParagraphStyleAttributeName
                   value:style
                   range:NSMakeRange(0, attrString.length)];
_label.attributedText = attrString;

1

ส่วนขยาย Swift 3:

    import UIKit

extension UILabel {
    func setTextWithLineSpacing(text: String, lineHeightMultiply: CGFloat = 1.3) {
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineHeightMultiple = lineHeightMultiply
        paragraphStyle.alignment = .center
        let attributedString = NSMutableAttributedString(string: text)
        attributedString.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: NSRange(location: 0, length: attributedString.length))
        self.attributedText = attributedString
    }
}

1

สิ่งนี้น่าจะช่วยได้ จากนั้นคุณสามารถกำหนดป้ายกำกับให้กับคลาสที่กำหนดเองนี้ภายในกระดานเรื่องราวและใช้พารามิเตอร์ของมันได้โดยตรงภายในคุณสมบัติ:

open class SpacingLabel : UILabel {

    @IBInspectable open var lineHeight:CGFloat = 1 {
        didSet {
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.lineSpacing = 1.0
            paragraphStyle.lineHeightMultiple = self.lineHeight
            paragraphStyle.alignment = self.textAlignment

            let attrString = NSMutableAttributedString(string: self.text!)
            attrString.addAttribute(NSAttributedStringKey.font, value: self.font, range: NSMakeRange(0, attrString.length))
            attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
            self.attributedText = attrString
        }
    } 
}

สิ่งนี้น่าจะช่วยได้ จากนั้นคุณสามารถกำหนดป้ายกำกับให้กับคลาสที่กำหนดเองนี้ภายในกระดานเรื่องราวและใช้พารามิเตอร์ของมันได้โดยตรงภายในคุณสมบัติ
Russell Warwick

กรุณาอย่าใส่เนื้อหาที่เกี่ยวข้องกับคำตอบของคุณในความคิดเห็น คำตอบของคุณควรมีประโยชน์โดยไม่ต้องอ่านความคิดเห็น
Neuron

1

ส่วนขยายป้าย Swift 4 การสร้าง NSMutableAttributedString ก่อนที่จะส่งผ่านฟังก์ชั่นในกรณีที่มีคุณสมบัติพิเศษที่จำเป็นสำหรับข้อความประกอบ

extension UILabel {

    func setLineHeightMultiple(to height: CGFloat, withAttributedText attributedText: NSMutableAttributedString) {

        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = 1.0
        paragraphStyle.lineHeightMultiple = height
        paragraphStyle.alignment = textAlignment

        attributedText.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attributedText.length - 1))

        self.attributedText = attributedText
    }
}

0

รหัสนี้ใช้ได้สำหรับฉัน (ios 7 & ios 8 แน่นอน)

_label.numberOfLines=2;
_label.textColor=[UIColor whiteColor];

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineHeightMultiple=0.5;
paragraphStyle.alignment = NSTextAlignmentCenter;
paragraphStyle.lineSpacing = 1.0;

NSDictionary *nameAttributes=@{
                               NSParagraphStyleAttributeName : paragraphStyle,
                               NSBaselineOffsetAttributeName:@2.0
                               };


NSAttributedString *string=[[NSAttributedString alloc] initWithString:@"22m\nago" attributes:nameAttributes];
_label.attributedText=string;

0

นี่คือทางออกของฉันอย่างรวดเร็ว คลาสย่อยควรใช้ได้กับทั้งสมบัติข้อความและข้อความและสำหรับ characterSpacing + lineSpacing มันจะรักษาระยะห่างถ้ามีการตั้งค่าสตริงใหม่หรือ

open class UHBCustomLabel : UILabel {
    @IBInspectable open var characterSpacing:CGFloat = 1 {
        didSet {
            updateWithSpacing()
        }

    }
    @IBInspectable open var lines_spacing:CGFloat = -1 {
        didSet {
            updateWithSpacing()
        }

    }
    open override var text: String? {
        set {
            super.text = newValue
            updateWithSpacing()
        }
        get {
            return super.text
        }
    }
    open override var attributedText: NSAttributedString? {
        set {
            super.attributedText = newValue
            updateWithSpacing() 
        }
        get {
            return super.attributedText
        }
    }
    func updateWithSpacing() {
        let attributedString = self.attributedText == nil ? NSMutableAttributedString(string: self.text ?? "") : NSMutableAttributedString(attributedString: attributedText!)
        attributedString.addAttribute(NSKernAttributeName, value: self.characterSpacing, range: NSRange(location: 0, length: attributedString.length))
        if lines_spacing >= 0 {
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.lineSpacing = lines_spacing
            paragraphStyle.alignment = textAlignment
            attributedString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))
        }
        super.attributedText = attributedString
    }
}

-5

ในฐานะที่เป็นวิธีแก้ปัญหาอย่างรวดเร็วสกปรกง่าย:

สำหรับ UILabels ที่ไม่มีเส้นมากคุณสามารถใช้ stackViews แทนได้

  1. สำหรับแต่ละบรรทัดเขียนป้ายกำกับใหม่
  2. ฝังไว้ใน StackView (เลือกทั้งป้ายกำกับ -> Editor -> ฝังใน -> StackView
  3. ปรับSpacingStackView ตามจำนวนที่คุณต้องการ

ให้แน่ใจว่าพวกเขาสแต็คในแนวตั้ง วิธีนี้ใช้ได้กับแบบอักษรที่กำหนดเองด้วย

ป้อนคำอธิบายรูปภาพที่นี่


FWIW นี่เป็นทางออกที่น่ากลัว แต่ใช้การได้ ดังนั้นฉันจะเก็บมันไว้
ฮันนี่

ฉันเคยเห็นหลักการ iOS ที่ใช้การซ้อนกันเพื่อสร้างกราฟ Stackviews มีประสิทธิภาพมาก
น้ำผึ้ง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.