UILabel mit Aufzählungszeichen formatieren?

89

Ist es möglich, das textin a zu formatieren UILabel, um einen Aufzählungspunkt anzuzeigen ?

Wenn ja, wie kann ich das machen?

rauben
quelle
@Hoque: UILabels behandeln ihren Text nicht als HTML.
Ben Zotto
2
Hier ist eine Klasse dafür! codeload.github.com/eyalc/ECListView/zip/master
Hemang
20
Warum ist dies als Off-Topic geschlossen? Dies ist eine legitime Frage mit einer legitimen Antwort.
Len
2
Warum um alles in der Welt wird dies von stackoverflow.com/users/237838/andrew-barber als nicht thematisch markiert ? Es ist möglicherweise ein Duplikat, aber keineswegs vom Thema entfernt ...
AppHandwerker
2
Shortcut - TasteALT+8 = •
TheTiger

Antworten:

162

Verwenden Sie möglicherweise den Unicode-Codepunkt für das Aufzählungszeichen in Ihrer Zeichenfolge?

Ziel c

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

Swift 4

myLabel.text = "\u{2022} This is a list item!"
Chris Doble
quelle
4
Vergib mir meine Unwissenheit, aber ich benutze die ganze Zeit UILabels und ich frage mich, ob du auf ein "zum Beispiel" hinweisen könntest.
DaveMac
1
myLabel.numberOfLines = 0Sie erhalten eine mehrzeilige Beschriftung, die Zeilenumbruchzeichen berücksichtigt. Im Allgemeinen benutze ich es aber gerne, UITextFieldweil es flexibler ist. Sie können beispielsweise leicht erkennen, auf welches Zeichen ein Benutzer bei der Arbeit mit a getippt UITextFieldhat. Ich glaube nicht, dass Sie dies mit a tun können UILabel. Textansichten haben auch viele andere nette Funktionen.
John Erck
7
Ein anderer Weg ist zu verwendenoption+8
Atulkhatri
3
Denken Sie daran, das Großbuchstaben 'u' zu verwenden, wenn Sie lokalisierbare Zeichenfolgen verwenden: \ U2022
Nikolaj Nielsen
1
Swift ist etwas anders, "\ u {2022}"
anders
80

einfach hinzufügen " • "

Sogar ich suchte so etwas für meine textView. Was ich getan habe, füge einfach die obige Zeichenfolge mit meiner Zeichenfolge hinzu und übergebe sie an meine textView. Dasselbe kann auch für getan werden labels.

Ich habe dies für den zukünftigen Betrachter beantwortet.

Zac24
quelle
• Hat für mich gearbeitet. Ich hatte * in Xcode, den ich gerade mit • kopiert / ersetzt habe, und es funktionierte gut für mein Label. Ich ersetzte "Label" durch •
Brian
44

Hier ist eine schöne Lösung mit 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)

Fügen Sie Aufzählungsattribute hinzu

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
}

Hier ist das Ergebnis:

Geben Sie hier die Bildbeschreibung ein

Krunal
quelle
Dies ist eine sehr elegante Lösung.
JeroenJK
9

In Swift 4 habe ich "•" mit neuer Zeile verwendet

 @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"
  }

Ausgabe:

Geben Sie hier die Bildbeschreibung ein

Jack
quelle
9
warum Fisch vermeiden
rd_
7

In kurzer Zeit 3.1

lblItemName.text = "\u{2022} This is a list item!"
Daxesh Nagar
quelle
3

Schauen Sie sich diesen Link an. Ich habe eine benutzerdefinierte Ansicht erstellt, um Text mit Aufzählungszeichen / anderen Symbolen / Bild (unter Verwendung der Eigenschaft attributeText von UILabel) als Listenelementsymbol (Swift 3.0) zu formatieren. Https://github.com/akshaykumarboth/SymbolTextLabel-iOS- Schnell

 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

         } 
    }
Akshay Kumar Beide
quelle
2

Wenn Sie den Texteinzug auch für die Aufzählungspunkte ausrichten möchten, können Sie die folgende Methode verwenden, NSAttributedStringmit der a mit den richtigen Einrückungs- und Abstandseigenschaften erstellt wird:

- (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;
}

Und Sie können diese Methode wie folgt anwenden, indem Sie eine NSArraymit den Texten übergeben und vorausgesetzt, Sie haben bereits eine 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];
Jonathan Cabrera
quelle
1

Ja. Kopieren Sie das folgende Aufzählungszeichen und fügen Sie es ein: Der Compiler von Swift kann das Aufzählungszeichen wie gewünscht in Xcode interpretieren und anzeigen, sonst wird nichts benötigt.

Wiederverwendung

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


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

Ausgabe

 Buy apples
 Buy oranges

Wiederverwendbares Array

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)

Ausgabe

 get apples
 get oranges
 get a bannana
ScottyBlades
quelle
1
Wenn Sie abstimmen. Zumindest die Höflichkeit zu sagen, warum.
ScottyBlades
Ich denke, der Grund dafür ist, dass Ihre Lösung nicht optimal ist. Am besten verwenden Sie den Unicode-Codepunkt.
Robert J. Clegg
Vielen Dank für die nachdenkliche Antwort. Warum ist der Unicode-Punkt besser?
ScottyBlades
Wenn der Entwickler dies mehrmals über verschiedene Bildschirme oder Projekte hinweg (nicht im selben Zeitraum) tun müsste, würde dies für ihn von größerem Nutzen sein, wenn er den Codepunktwert kennt. Sie müssen also nicht die obige Antwort oder einen ähnlichen Ort in Ordnung bringen, um sie zu kopieren. Nun, das sind sowieso meine Gedanken dazu.
Robert J. Clegg
1
@ RobertJ.Clegg Ich habe gerade meine Antwort aktualisiert, um eine wiederverwendbare Option bereitzustellen. Können Sie mir ein Beispiel geben, wann eine Codepunktzeichenfolge den Aufzählungspunkt wiederverwendbarer macht als eine direkte Aufzählungszeichenfolge?
ScottyBlades
0

Wenn jemand wie ich nach Textansichtstext mit Aufzählungszeichen sucht, ist unten die Antwort. Übrigens funktioniert es nur für statischen Text.

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

Ich habe den obigen Text der Textansicht zugewiesen. Es hat wie für mich vorgesehen funktioniert.

Narasimha Nallamsetty
quelle
0

Hier ist die Lösung von @krunal, die in die Swift 5- NSAttributedStringErweiterung umgestaltet wurde :

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
    }
}
Tadija
quelle