Форматувати UILabel з маркерами?


89

Чи можна відформатувати textin в, UILabelщоб показати крапку ?

Якщо так, то як я можу це зробити?


@Hoque: UILabels не розглядають текст як HTML.
Ben Zotto

2
Ось клас для цього! codeload.github.com/eyalc/ECListView/zip/master
Hemang

20
Чому це закрито як поза темою? Це законне запитання з правомірною відповіддю.
LEN

2
Чому,
боже,

2
Комбінація клавішALT+8 = •
TheTiger

Відповіді:


162

Можливо, використовувати точку коду Unicode для символу маркера у вашому рядку?

Завдання-c

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

Стрімкий 4

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

4
Пробачте за незнання, але я весь час використовую UILabels, і мені цікаво, чи можете ви вказати "наприклад".
daveMac

1
myLabel.numberOfLines = 0отримує багаторядкову мітку, яка поважатиме символи розриву рядка. Загалом, хоча я люблю користуватися, UITextFieldоскільки він більш гнучкий. Наприклад, ви можете легко визначити, по якому символу користувач натискав, працюючи з a UITextField, я не думаю, що ви можете це зробити з a UILabel. Представлення тексту також має безліч інших акуратних функцій.
Джон Ерк,

7
Іншим способом є використанняoption+8
атулхатрі

3
Пам’ятайте, що слід використовувати велику букву „u“, якщо ви використовуєте локалізовані рядки: \ U2022
Микола Нільсен

1
Свіфт дещо інший, "\ u {2022}"
Андерс

80

просто додайте " • "

Навіть я шукав щось подібне для свого textView. Те, що я зробив, просто додайте вище рядок зі своїм рядком і передайте його своєму textView, те саме можна зробити і для labels.

Я відповів на це для майбутнього глядача.


• Працював у мене. У мене був * у Xcode, який я просто скопіював / замінив за допомогою • і він працював нормально для мого лейбла. Я замінив «Етикетку» на •
Брайан

46

Ось гарне рішення із 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)

Додайте атрибути маркера

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
}

Ось результат:

введіть тут опис зображення


Це дуже елегантне рішення.
JeroenJK

9

У Swift 4 я використав "•" з новою лінією

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

Вихід:

введіть тут опис зображення


9
чому уникати риби
rd_


3

Перевірте це посилання, я створив власний перегляд для форматування тексту з крапками маркера / іншими символами / зображенням (використовуючи властивість attributeText UILabel) як символ елемента списку (Swift 3.0) https://github.com/akshaykumarboth/SymbolTextLabel-iOS- Стрімкий

 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

Якщо ви також хочете вирівняти відступ тексту для пунктів маркерів, ви можете скористатися наступним методом, який створює a NSAttributedStringз належними властивостями відступу та інтервалу:

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

І ви можете використовувати цей метод наступним чином, передавши файл NSArray разом із текстом і надавши вам уже 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

Так. Скопіюйте та вставте такий маркер: компілятор Swift може інтерпретувати та відображати маркер за бажанням у Xcode, нічого іншого не потрібно.

Повторне використання

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


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

вихід

 Buy apples
 Buy oranges

Багаторазовий масив

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)

вихід

 get apples
 get oranges
 get a bannana

1
Якщо ви проти. Принаймні, майте ввічливість, щоб сказати, чому.
ScottyBlades

Я думаю, що причина в тому, що ваше рішення не є оптимальним. Найкраще використовувати точку коду Юнікод.
Роберт Дж.

Дякую за вдумливу відповідь. Чому точка Unicode краща?
ScottyBlades

Тому що, якщо розробнику потрібно було зробити це кілька разів, на різних екранах або проектах (не в той самий період часу), це пішло б їм на користь більше, знаючи, яке значення має кодова точка. Таким чином, не потрібно їхати та штрафувати наведену вище відповідь або подібне місце, щоб скопіювати її. Ну, це все одно я про це думаю.
Роберт Дж. Клегг,

1
@ RobertJ.Clegg Я щойно оновив свою відповідь, надавши можливість багаторазового використання. Чи можете ви навести приклад того, коли рядок кодової точки робить крапку кулі більш багаторазовою, ніж рядок прямої кулі?
ScottyBlades

0

Якщо хтось шукає текст із текстовим текстом із крапками, як я, нижче відповідь. До речі, це працює лише для статичного тексту.

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

Я призначив текст для перегляду тексту. Це спрацювало, як призначено для мене.


0

Ось рішення від @krunal, перероблене у NSAttributedStringрозширення 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
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.