Định dạng UILabel với các dấu đầu dòng?


89

Có thể định dạng texttrong a UILabelđể hiển thị dấu đầu dòng không?

Nếu vậy, Làm thế nào tôi có thể làm điều đó?


@Hoque: UILabels không coi văn bản của họ là HTML.
Ben Zotto

2
Đây là một lớp học cho điều này! codeload.github.com/eyalc/ECListView/zip/master
Hemang

20
Tại sao điều này bị đóng lại là lạc đề? Đây là một câu hỏi chính đáng với một câu trả lời chính đáng.
len

2
Tại sao trên trái đất được này đánh dấu là tắt chủ đề bằng cách stackoverflow.com/users/237838/andrew-barber có thể nó là một bản sao nhưng không có nghĩa là off topic ...
AppHandwerker

2
Phím tắtALT+8 = •
TheTiger

Câu trả lời:


162

Có thể sử dụng điểm mã Unicode cho ký tự dấu đầu dòng trong chuỗi của bạn?

Objective-c

myLabel.text = @"\u2022 This is a list item!";

Swift 4

myLabel.text = "\u{2022} This is a list item!"

4
Thứ lỗi cho sự thiếu hiểu biết của tôi nhưng tôi sử dụng UILabels mọi lúc và tôi tự hỏi liệu bạn có thể chỉ ra một "ví dụ" không.
daveMac

1
myLabel.numberOfLines = 0giúp bạn có nhãn nhiều dòng sẽ tôn trọng các ký tự ngắt dòng. Nói chung mặc dù tôi thích sử dụng UITextFieldvì nó linh hoạt hơn. Ví dụ: bạn có thể dễ dàng phát hiện người dùng đã nhấn vào ký tự nào khi làm việc với a UITextField, tôi không nghĩ bạn có thể làm điều đó với a UILabel. Chế độ xem văn bản cũng có nhiều tính năng gọn gàng khác.
John Erck

7
Một cách khác là sử dụngoption+8
atulkhatri

3
Hãy nhớ sử dụng vốn 'u' nếu bạn sử dụng chuỗi bản địa hóa: \ U2022
Nikolaj Nielsen

1
Swift hơi khác một chút, "\ u {2022}"
anders

80

chỉ cần thêm " • "

Ngay cả khi tôi đang tìm kiếm một cái gì đó như thế này cho của tôi textView. Những gì tôi đã làm, chỉ cần nối chuỗi bên trên với chuỗi của tôi và chuyển nó cho của tôi textView, điều tương tự cũng có thể được thực hiện labels.

Tôi đã trả lời điều này cho Người xem trong tương lai.


• Đã làm cho tôi. Tôi có * trong Xcode Tôi chỉ sao chép / thay thế bằng cách sử dụng • và nó hoạt động tốt cho Nhãn của tôi. Tôi đã thay thế "Nhãn" bằng •
Brian

46

Đây là giải pháp tốt với Swift

let label = UILabel()
label.frame = CGRect(x: 40, y: 100, width: 280, height: 600)
label.textColor = UIColor.lightGray
label.numberOfLines = 0

let arrayString = [
    "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
    "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
    "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
    "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
]

label.attributedText = add(stringList: arrayString, font: label.font, bullet: "")

self.view.addSubview(label)

Thêm thuộc tính dấu đầu dòng

func add(stringList: [String],
         font: UIFont,
         bullet: String = "\u{2022}",
         indentation: CGFloat = 20,
         lineSpacing: CGFloat = 2,
         paragraphSpacing: CGFloat = 12,
         textColor: UIColor = .gray,
         bulletColor: UIColor = .red) -> NSAttributedString {

    let textAttributes: [NSAttributedStringKey: Any] = [NSAttributedStringKey.font: font, NSAttributedStringKey.foregroundColor: textColor]
    let bulletAttributes: [NSAttributedStringKey: Any] = [NSAttributedStringKey.font: font, NSAttributedStringKey.foregroundColor: bulletColor]

    let paragraphStyle = NSMutableParagraphStyle()
    let nonOptions = [NSTextTab.OptionKey: Any]()
    paragraphStyle.tabStops = [
        NSTextTab(textAlignment: .left, location: indentation, options: nonOptions)]
    paragraphStyle.defaultTabInterval = indentation
    //paragraphStyle.firstLineHeadIndent = 0
    //paragraphStyle.headIndent = 20
    //paragraphStyle.tailIndent = 1
    paragraphStyle.lineSpacing = lineSpacing
    paragraphStyle.paragraphSpacing = paragraphSpacing
    paragraphStyle.headIndent = indentation

    let bulletList = NSMutableAttributedString()
    for string in stringList {
        let formattedString = "\(bullet)\t\(string)\n"
        let attributedString = NSMutableAttributedString(string: formattedString)

        attributedString.addAttributes(
            [NSAttributedStringKey.paragraphStyle : paragraphStyle],
            range: NSMakeRange(0, attributedString.length))

        attributedString.addAttributes(
            textAttributes,
            range: NSMakeRange(0, attributedString.length))

        let string:NSString = NSString(string: formattedString)
        let rangeForBullet:NSRange = string.range(of: bullet)
        attributedString.addAttributes(bulletAttributes, range: rangeForBullet)
        bulletList.append(attributedString)
    }

    return bulletList
}

Đây là kết quả:

nhập mô tả hình ảnh ở đây


Đây là một giải pháp rất thanh lịch.
JeroenJK

9

Trong Swift 4, tôi đã sử dụng "•" với Dòng mới

 @IBOutlet weak var bulletLabel: UILabel!
 let arrayOfLines = ["Eat egg for protein","You should Eat Ghee","Wheat is with high fiber","Avoid to eat Fish "]
 for value in arrayOfLines {
     bulletLabel.text = bulletLabel.text!  + " • " + value + "\n"
  }

Đầu ra:

nhập mô tả hình ảnh ở đây


9
tại sao phải tránh cá
rd_


3

Hãy xem liên kết này, tôi đã tạo chế độ xem Tùy chỉnh để định dạng văn bản với dấu đầu dòng / ký hiệu khác / hình ảnh (sử dụng thuộc tính propertyText của UILabel) làm biểu tượng mục danh sách (Swift 3.0) https://github.com/akshaykumarboth/SymbolTextLabel-iOS- Nhanh

 import UIKit

    class ViewController: UIViewController {

    @IBOutlet var symbolView: SymbolTextLabel!

    var testString = "Understanding the concept of sales"

    var bulletSymbol = "\u{2022}" 
    var fontsize: CGFloat= 18
    override func viewDidLoad() {

        super.viewDidLoad()
         //First way // Dynamically creating SymbolTextLabel object

        let symbolTextLabel = SymbolTextLabel(frame: CGRect(x: 0, y: 0, width: 0, height: 0))

        symbolTextLabel.setText(text: testString, symbolCode: bulletSymbol) //setting text and symbol of text item

        symbolTextLabel.setFontSize(textSize: fontsize) // setting font size

        //symbolTextLabel.setSpacing(spacing: 5) // setting space between symbol and text

        self.view.addSubview(symbolTextLabel) 
//second way // from storyboard or interface builder

     symbolView.setText(text: testString, symbolCode: bulletSymbol)
 //setting text and symbol of text item 

    symbolView.setFontSize(textSize: fontsize) // setting font size

        //symbolView.setSpacing(spacing: 5) // setting space between symbol and text

         } 
    }

2

Nếu bạn cũng muốn căn chỉnh thụt lề văn bản cho các dấu đầu dòng, bạn có thể sử dụng phương pháp sau để tạo a NSAttributedStringvới các thuộc tính thụt lề và giãn cách thích hợp:

- (NSAttributedString *)attributedStringForBulletTexts:(NSArray *)stringList
                                              withFont:(UIFont *)font
                                          bulletString:(NSString *)bullet
                                           indentation:(CGFloat)indentation
                                           lineSpacing:(CGFloat)lineSpacing
                                      paragraphSpacing:(CGFloat)paragraphSpacing
                                             textColor:(UIColor *)textColor
                                           bulletColor:(UIColor *)bulletColor {

    NSDictionary *textAttributes = @{NSFontAttributeName: font,
                                 NSForegroundColorAttributeName: textColor};
    NSDictionary *bulletAttributes = @{NSFontAttributeName: font, NSForegroundColorAttributeName: bulletColor};

    NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new];
    paragraphStyle.tabStops = @[[[NSTextTab alloc] initWithTextAlignment: NSTextAlignmentLeft location:indentation options:@{}]];
    paragraphStyle.defaultTabInterval = indentation;
    paragraphStyle.lineSpacing = lineSpacing;
    paragraphStyle.paragraphSpacing = paragraphSpacing;
    paragraphStyle.headIndent = indentation;

    NSMutableAttributedString *bulletList = [NSMutableAttributedString new];

    for (NSString *string in stringList) {
        NSString *formattedString = [NSString stringWithFormat:@"%@\t%@\n", bullet, string];
        NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:formattedString];
        if (string == stringList.lastObject) {
            paragraphStyle = [paragraphStyle mutableCopy];
            paragraphStyle.paragraphSpacing = 0;
        }
        [attributedString addAttributes:@{NSParagraphStyleAttributeName: paragraphStyle} range:NSMakeRange(0, attributedString.length)];
        [attributedString addAttributes:textAttributes range:NSMakeRange(0, attributedString.length)];

        NSRange rangeForBullet = [formattedString rangeOfString:bullet];
        [attributedString addAttributes:bulletAttributes range:rangeForBullet];
        [bulletList appendAttributedString:attributedString];
    }

    return bulletList;
}

Và bạn có thể sử dụng phương pháp đó như sau, bằng cách chuyển một NSArrayvới các văn bản và cung cấp cho bạn đã có UILabel:

NSArray *stringArray = @[@"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
                         @"Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
                         @"Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
                         @"Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
                         ];

label.attributedText = [self attributedStringForBulletTexts:stringArray
                                                   withFont:label.font
                                               bulletString:@"•"
                                                indentation:15
                                                lineSpacing:2
                                           paragraphSpacing:10
                                                  textColor:UIColor.blackColor
                                                bulletColor:UIColor.grayColor];

1

Đúng. Sao chép và dán dấu đầu dòng sau: Trình biên dịch của Swift có thể giải thích và hiển thị dấu đầu dòng như mong muốn trong Xcode, không cần gì khác.

Tái sử dụng

extension String {
    static var bullet: String {
        return "• "
    }
}


print(String.bullet + "Buy apples")
let secondPoint: String = .bullet + "Buy oranges"
print(secondPoint)

đầu ra

 Buy apples
 Buy oranges

Mảng có thể tái sử dụng

extension Array where Element == String {

    var bulletList: String {
        var po = ""
        for (index, item) in self.enumerated() {
            if index != 0 {
                po += "\n"
            }
            po += .bullet + item
        }
        return po
    }
}


print(["get apples", "get oranges", "get a bannana"].bulletList)

đầu ra

 get apples
 get oranges
 get a bannana

1
Nếu bạn không tán thành. Ít nhất phải có phép lịch sự để nói tại sao.
ScottyBlades

Tôi nghĩ nguyên nhân là do cách giải quyết của bạn chưa tối ưu. Sử dụng điểm mã unicode là tốt nhất.
Robert J. Clegg

Cảm ơn bạn đã trả lời chu đáo. Tại sao điểm Unicode tốt hơn?
ScottyBlades

Bởi vì, nếu nhà phát triển cần thực hiện điều này nhiều lần, trên các màn hình hoặc dự án khác nhau (Không trong cùng một khoảng thời gian) thì điều đó sẽ có lợi cho họ nhiều hơn, bằng cách biết giá trị điểm mã là gì. Vì vậy, không cần phải đi và phạt câu trả lời ở trên hoặc nơi tương tự, để sao chép nó từ. Vâng, đó là suy nghĩ của tôi về nó anyway.
Robert J. Clegg

1
@ RobertJ.Clegg Tôi vừa cập nhật câu trả lời của mình để cung cấp tùy chọn có thể tái sử dụng. Bạn có thể cho tôi một ví dụ về khi nào một chuỗi điểm mã làm cho dấu đầu dòng có thể tái sử dụng nhiều hơn một chuỗi dấu đầu dòng trực tiếp không?
ScottyBlades

0

Nếu ai đang tìm kiếm văn bản textview có gạch đầu dòng giống tôi thì dưới đây là câu trả lời. Bằng cách này, nó chỉ hoạt động cho văn bản tĩnh.

   Better experience - Refer a friend and How to Play \n Tournaments performance improvement\n UI/UX Improvements\n Critical bug fixes

Tôi đã gán văn bản trên cho textview. Nó hoạt động như dự định đối với tôi.


0

Đây là giải pháp từ @krunal được tái cấu trúc thành NSAttributedStringtiện ích mở rộng Swift 5 :

import UIKit

public extension NSAttributedString {
    static func makeBulletList(from strings: [String],
                               bulletCharacter: String = "\u{2022}",
                               bulletAttributes: [NSAttributedString.Key: Any] = [:],
                               textAttributes: [NSAttributedString.Key: Any] = [:],
                               indentation: CGFloat = 20,
                               lineSpacing: CGFloat = 1,
                               paragraphSpacing: CGFloat = 10) -> NSAttributedString
    {
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.defaultTabInterval = indentation
        paragraphStyle.tabStops = [
            NSTextTab(textAlignment: .left, location: indentation)
        ]
        paragraphStyle.lineSpacing = lineSpacing
        paragraphStyle.paragraphSpacing = paragraphSpacing
        paragraphStyle.headIndent = indentation

        let bulletList = NSMutableAttributedString()

        for string in strings {
            let bulletItem = "\(bulletCharacter)\t\(string)\n"

            var attributes = textAttributes
            attributes[.paragraphStyle] = paragraphStyle

            let attributedString = NSMutableAttributedString(
                string: bulletItem, attributes: attributes
            )

            if !bulletAttributes.isEmpty {
                let bulletRange = (bulletItem as NSString).range(of: bulletCharacter)
                attributedString.addAttributes(bulletAttributes, range: bulletRange)
            }

            bulletList.append(attributedString)
        }

        if bulletList.string.hasSuffix("\n") {
            bulletList.deleteCharacters(
                in: NSRange(location: bulletList.length - 1, length: 1)
            )
        }

        return bulletList
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.