글 머리 기호로 UILabel을 포맷 하시겠습니까?


89

그것은 포맷 할 수 있나요 textA의를 UILabel공연하는 글 머리 기호를 ?

그렇다면 어떻게해야합니까?


@Hoque : UILabels는 텍스트를 HTML로 취급하지 않습니다.
Ben Zotto 2011

2
이것에 대한 수업이 있습니다! codeload.github.com/eyalc/ECListView/zip/master
Hemang 2013-10-23

20
이것이 주제에서 벗어난 것으로 마감 된 이유는 무엇입니까? 이것은 정당한 대답이있는 정당한 질문입니다.
len

2
왜 지구에이에 의해 주제 해제로 표시됩니다 stackoverflow.com/users/237838/andrew-barber ... 그 가능성이 중복되지만 주제 오프 결코
AppHandwerker

2
바로 가기 키ALT+8 = •
TheTiger

답변:


162

문자열의 글 머리 기호 문자에 유니 코드 코드 포인트를 사용 하시겠습니까?

목표 -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더 유연 하기 때문에 사용하는 것을 좋아합니다 . 예를 들어 사용자가를 사용할 때 어떤 문자를 탭했는지 쉽게 감지 UITextField할 수 있지만 UILabel. 텍스트보기에는 다른 많은 깔끔한 기능도 있습니다.
John Erck 2014

7
또 다른 방법은 사용하는 것입니다option+8
atulkhatri

3
현지화 가능한 문자열을 사용하는 경우 대문자 'u'를 사용해야합니다. \ U2022
Nikolaj Nielsen

1
Swift는 약간 다릅니다. "\ u {2022}"
anders

80

그냥 추가 " • "

심지어 나는 내 textView. 내가 한 일은 문자열 위에 문자열을 추가하고 내으로 전달하면 textView똑같이 할 수 있습니다 labels.

나는 미래의 뷰어를 위해 이것을 대답했다.


• 나를 위해 일했습니다. Xcode에서 *를 사용하여 복사 / 교체했습니다. • 레이블에 대해 잘 작동했습니다. "Label"을 다음으로 대체했습니다.
Brian

49

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 에서는 "•"를 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"
  }

산출:

여기에 이미지 설명 입력


9
물고기를 피해야하는 이유
rd_

복사하여 붙여 넣기 만하면됩니다.-> •
Vijay Patidar


3

이 링크를 확인하여 글 머리 기호 / 기타 기호 / 이미지 (UILabel의 attributeText 속성 사용)가있는 텍스트를 목록 항목 기호 (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

글 머리 기호에 대한 텍스트 들여 쓰기도 정렬 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

그 이유는 귀하의 솔루션이 최적이 아니기 때문이라고 생각합니다. 유니 코드 코드 포인트를 사용하는 것이 가장 좋습니다.
Robert J. Clegg

신중한 답변 감사합니다. 유니 코드 포인트가 더 나은 이유는 무엇입니까?
ScottyBlades

개발자가 여러 화면이나 프로젝트 (동일한 기간이 아님)에서이 작업을 여러 번 수행해야하는 경우 코드 포인트 값이 무엇인지 알면 더 많은 이점을 얻을 수 있기 때문입니다. 따라서 위의 답변이나 유사한 장소를 가서 복사 할 필요가 없습니다. 음, 어쨌든 그것에 대한 내 생각입니다.
Robert J. Clegg

1
@ RobertJ.Clegg 재사용 가능한 옵션을 제공하기 위해 답변을 업데이트했습니다. 코드 포인트 문자열이 직접 글 머리 기호 문자열보다 글 머리 기호를 더 재사용 할 수있게 만드는 예를 들어 주실 수 있습니까?
ScottyBlades

0

저와 같은 글 머리 기호가있는 textview 텍스트를 찾는 사람은 아래에 답변이 있습니다. 그건 그렇고 정적 텍스트에서만 작동합니다.

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

위의 텍스트를 textview에 할당했습니다. 제 의도대로 작동했습니다.


0

Swift 5 확장 으로 리팩토링 된 @krunal 의 솔루션은 다음과 같습니다 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
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.