UILabel madde işaretleri ile biçimlendirilsin mi?


89

O biçimlendirmek mümkün mü textbir de UILabelbir göstermeye mermi noktasını ?

Varsa bunu nasıl yapabilirim?


@Hoque: UILabels metinlerine HTML olarak davranmaz.
Ben Zotto

2
İşte bunun için bir sınıf! codeload.github.com/eyalc/ECListView/zip/master
Hemang

20
Bu neden konu dışı olarak kapatıldı? Bu, meşru bir cevabı olan meşru bir sorudur.
len

2
Neden bu konu stackoverflow.com/users/237838/andrew-barber tarafından konu dışı olarak işaretleniyor , muhtemelen bir kopyası ancak hiçbir şekilde konu dışı ...
AppHandwerker

2
Kısayol tuşuALT+8 = •
TheTiger

Yanıtlar:


162

Dizinizdeki madde işareti karakteri için Unicode kod noktasını kullanabilirsiniz.

Amaç-c

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

Swift 4

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

4
Cehaletimi bağışla ama ben her zaman UILabels kullanıyorum ve acaba bir "örneğin" işaret edebilir misin?
daveMac

1
myLabel.numberOfLines = 0satır sonu karakterlerine saygı duyan çok satırlı bir etiket alır. Genel olarak UITextFielddaha esnek olduğu için kullanmayı seviyorum . Örneğin, bir kullanıcının a ile çalışırken hangi karaktere dokunduğunu kolayca tespit edebilirsiniz, bunu a ile UITextFieldyapabileceğinizi sanmıyorum UILabel. Metin görünümleri ayrıca diğer birçok düzgün özelliğe sahiptir.
John Erck

7
Başka bir yol kullanmakoption+8
atulkhatri

3
Yerelleştirilebilir dizeler kullanıyorsanız büyük 'u' kullanmayı unutmayın: \ U2022
Nikolaj Nielsen

1
Swift, biraz farklıdır "\ u {2022}"
Anders

80

sadece ekle " • "

Ben bile kendim için böyle bir şey arıyordum textView. Yaptığım şey, sadece dizgemle yukarıdaki dizeyi ekleyin ve onu benim için iletin textView, aynısı için labelsde yapılabilir .

Bunu gelecekteki Görüntüleyici için yanıtladım.


• Benim için çalıştı. Xcode'da * vardı * kullanarak kopyaladım / değiştirdim ve Etiketim için sorunsuz çalıştı "Etiket" i ile değiştirdim •
Brian

49

İşte Swift ile güzel bir çözüm

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)

Madde işareti nitelikleri ekleyin

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
}

İşte sonuç:

görüntü açıklamasını buraya girin


Bu çok zarif bir çözüm.
Jeroen

9

In Swift 4 i kullandım "•" Yeni Hat ile

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

Çıktı:

görüntü açıklamasını buraya girin


9
neden balıklardan kaçınılmalı
rd_

Sadece kopyalayıp yapıştırın -> •
Vijay Patidar


3

Bu bağlantıya göz atın, metni madde işaretleri / diğer semboller / resim ile (UILabel'in attributeText özelliğini kullanarak) liste öğesi sembolü olarak biçimlendirmek için Özel bir görünüm yaptım (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

Madde işaretleri için metin NSAttributedStringgirintisini de hizalamak istiyorsanız , uygun girinti ve aralık özellikleriyle a oluşturan aşağıdaki yöntemi kullanabilirsiniz :

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

Ve bu yöntemi NSArray, metinlerle bir geçerek ve zaten bir 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

Evet. Aşağıdaki madde işaretini kopyalayıp yapıştırın: Swift'in derleyicisi madde işaretini Xcode içinde istendiği gibi yorumlayabilir ve görüntüleyebilir, başka hiçbir şeye gerek yoktur.

Yeniden kullan

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


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

çıktı

• Buy apples
• Buy oranges

Yeniden kullanılabilir dizi

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)

çıktı

get apples
• get oranges
• get a bannana

1
Olumsuz oy verirseniz. En azından nedenini söyleme nezaketini göster.
ScottyBlades

Bunun sebebinin çözümünüzün optimal olmamasından kaynaklandığını düşünüyorum. Unicode kod noktasını kullanmak en iyisidir.
Robert J. Clegg

Düşünceli yanıtınız için teşekkür ederim. Unicode noktası neden daha iyi?
ScottyBlades

Çünkü geliştiricinin bunu birden çok kez, farklı ekranlarda veya projelerde (aynı zaman diliminde değil) yapması gerekiyorsa, kod noktası değerinin ne olduğunu bilmesi onlara daha fazla fayda sağlayacaktır. Böylece, kopyalamak için yukarıdaki cevaba veya benzer bir yere gidip para cezası vermenize gerek kalmaz. Zaten bu benim düşüncelerim.
Robert J. Clegg

1
@ RobertJ.Clegg Yeniden kullanılabilir bir seçenek sağlamak için cevabımı güncelledim. Bir kod noktası dizesinin madde işaretini doğrudan madde işaretli bir dizeden daha yeniden kullanılabilir hale getirdiğinde bana bir örnek verebilir misiniz?
ScottyBlades

0

Benim gibi madde işaretli metin görüntüleme metni arayan biri varsa, cevap aşağıdadır. Bu arada, sadece statik metin için çalışıyor.

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

Yukarıdaki metni metin görünümüne atadım. Benim için tasarlandığı gibi çalıştı.


0

İşte @ krunal'ın Swift 5 NSAttributedStringuzantısına yeniden düzenlenmiş çözümü :

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
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.