Formattare UILabel con elenchi puntati?


89

È possibile formattare textin a UILabelper mostrare un punto elenco ?

In caso affermativo, come posso farlo?


@Hoque: UILabels non trattano il loro testo come HTML.
Ben Zotto


20
Perché questo è chiuso come fuori tema? Questa è una domanda legittima con una risposta legittima.
len

2
Perché
diavolo

2
Tasto di scelta rapidaALT+8 = •
TheTiger

Risposte:


162

Forse utilizzare il punto di codice Unicode per il carattere punto elenco nella stringa?

Obiettivo-c

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

Swift 4

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

4
Perdona la mia ignoranza ma uso sempre le etichette UIL e mi chiedo se potresti indicare un "ad esempio".
daveMac

1
myLabel.numberOfLines = 0ti fornisce un'etichetta su più righe che rispetterà i caratteri di interruzione di riga. In generale però mi piace usare UITextFieldperché è più flessibile. Ad esempio, puoi facilmente rilevare quale personaggio un utente ha toccato quando lavora con a UITextField, non penso che tu possa farlo con a UILabel. Le viste di testo hanno anche molte altre caratteristiche interessanti.
John Erck

7
Un altro modo è usareoption+8
atulkhatri

3
Ricorda di utilizzare la "u" maiuscola se utilizzi stringhe localizzabili: \ U2022
Nikolaj Nielsen

1
Swift è leggermente diversa, "\ u {2022}"
Anders

80

basta aggiungere " • "

Anche io stavo cercando qualcosa di simile per il mio textView. Quello che ho fatto, basta aggiungere la stringa sopra con la mia stringa e passarla al mio textView, lo stesso può essere fatto labelsanche per .

Ho risposto a questo per il futuro visualizzatore.


• Ha funzionato per me. Avevo * in Xcode che ho appena copiato / sostituito usando • e ha funzionato bene per la mia etichetta ho sostituito "Etichetta" con •
Brian

46

Ecco una bella soluzione con 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)

Aggiungi attributi di proiettile

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
}

Ecco il risultato:

inserisci qui la descrizione dell'immagine


Questa è una soluzione molto elegante.
JeroenJK

9

In Swift 4 ho usato "•" con new Line

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

Produzione:

inserisci qui la descrizione dell'immagine


9
perché evitare il pesce
rd_


3

Dai un'occhiata a questo collegamento, ho creato una visualizzazione personalizzata per formattare il testo con punti elenco / altri simboli / immagine (utilizzando la proprietà attributeText di UILabel) come simbolo dell'elemento dell'elenco (Swift 3.0) https://github.com/akshaykumarboth/SymbolTextLabel-iOS- Swift

 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

Se desideri allineare il rientro del testo anche per i punti elenco, puoi utilizzare il seguente metodo che crea un NSAttributedStringcon le proprietà di rientro e spaziatura appropriate:

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

E puoi usare quel metodo come segue, passando un NSArraycon i testi e purché tu abbia già un 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

Sì. Copia e incolla il seguente punto: il compilatore di Swift può interpretare e visualizzare il punto come desiderato all'interno di Xcode, nient'altro necessario.

Riutilizzo

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


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

produzione

 Buy apples
 Buy oranges

Matrice riutilizzabile

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)

produzione

 get apples
 get oranges
 get a bannana

1
Se dai un voto negativo. Almeno abbi la cortesia di dire perché.
ScottyBlades

Penso che il motivo sia dovuto al fatto che la tua soluzione non è ottimale. L'utilizzo del punto di codice Unicode è il migliore.
Robert J. Clegg,

Grazie per la premurosa risposta. Perché il punto Unicode è migliore?
ScottyBlades

Perché, se lo sviluppatore avesse bisogno di farlo più volte, su schermi o progetti diversi (non nello stesso periodo di tempo) ne trarrebbe maggiori benefici, sapendo qual è il valore del punto di codice. Quindi, non è necessario andare e multare la risposta di cui sopra o un luogo simile, per copiarla. Bene, questo è comunque il mio pensiero al riguardo.
Robert J. Clegg

1
@ RobertJ.Clegg Ho appena aggiornato la mia risposta per fornire un'opzione riutilizzabile. Potete farmi un esempio di quando una stringa di punti di codice rende il punto elenco più riutilizzabile di una stringa di punti elenco diretta?
ScottyBlades,

0

Se qualcuno cerca testo in visualizzazione testo con elenchi puntati come me, di seguito è la risposta. A proposito, funziona solo per il testo statico.

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

Ho assegnato il testo sopra a textview. Ha funzionato come previsto per me.


0

Ecco la soluzione da @krunal refactored nell'estensione Swift 5 NSAttributedString:

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
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.