เป็นไปได้ไหมที่จะจัดรูปแบบtext
ใน a UILabel
เพื่อแสดงสัญลักษณ์แสดงหัวข้อย่อย ?
ถ้าเป็นเช่นนั้นฉันจะทำได้อย่างไร?
เป็นไปได้ไหมที่จะจัดรูปแบบtext
ใน a UILabel
เพื่อแสดงสัญลักษณ์แสดงหัวข้อย่อย ?
ถ้าเป็นเช่นนั้นฉันจะทำได้อย่างไร?
ALT+8 = •
คำตอบ:
อาจใช้จุดรหัส Unicode สำหรับอักขระสัญลักษณ์แสดงหัวข้อย่อยในสตริงของคุณ?
วัตถุประสงค์ -c
myLabel.text = @"\u2022 This is a list item!";
สวิฟต์ 4
myLabel.text = "\u{2022} This is a list item!"
myLabel.numberOfLines = 0
ทำให้คุณมีป้ายกำกับหลายบรรทัดซึ่งจะเคารพอักขระตัวแบ่งบรรทัด โดยทั่วไปแม้ว่าฉันจะชอบใช้UITextField
เพราะมันยืดหยุ่นกว่า ตัวอย่างเช่นคุณสามารถตรวจจับได้อย่างง่ายดายว่าผู้ใช้แตะอักขระใดเมื่อทำงานกับ a UITextField
ฉันไม่คิดว่าคุณจะทำเช่นนั้นกับไฟล์UILabel
. มุมมองข้อความยังมีคุณสมบัติที่เป็นระเบียบอื่น ๆ อีกมากมาย
option+8
เพียงแค่เพิ่ม " • "
แม้แต่ฉันก็กำลังมองหาบางอย่างเช่นนี้สำหรับtextView
. สิ่งที่ฉันทำเพียงแค่ต่อท้ายสตริงด้วยสตริงของฉันแล้วส่งต่อไปยังของฉันtextView
ก็สามารถทำได้labels
เช่นกัน
ฉันตอบสิ่งนี้สำหรับผู้ดูในอนาคต
นี่คือทางออกที่ดีสำหรับ 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)
เพิ่มแอตทริบิวต์ bullet
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
}
นี่คือผลลัพธ์:
อย่างรวดเร็ว 3.1
lblItemName.text = "\u{2022} This is a list item!"
ลองดูลิงค์นี้ฉันสร้างมุมมองแบบกำหนดเองเพื่อจัดรูปแบบข้อความด้วยสัญลักษณ์แสดงหัวข้อย่อย / สัญลักษณ์อื่น ๆ / รูปภาพ (โดยใช้คุณสมบัติ 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
}
}
หากคุณต้องการจัดแนวการเยื้องข้อความสำหรับสัญลักษณ์แสดงหัวข้อย่อยเช่นกันคุณสามารถใช้วิธีการต่อไปนี้ที่สร้าง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];
ใช่. คัดลอกและวางสัญลักษณ์แสดงหัวข้อย่อยต่อไปนี้: •
คอมไพเลอร์ของ 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
หากใครที่กำลังมองหา textview text ที่มีสัญลักษณ์แสดงหัวข้อย่อยเหมือนผมด้านล่างนี้คือคำตอบ โดยวิธีนี้ใช้ได้กับข้อความคงที่เท่านั้น
• Better experience - Refer a friend and How to Play \n• Tournaments performance improvement\n• UI/UX Improvements\n• Critical bug fixes
ฉันได้กำหนดข้อความด้านบนให้กับ textview มันได้ผลตามที่ตั้งใจไว้สำหรับฉัน
นี่คือวิธีแก้ปัญหาจาก@krunal refactored เป็น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
}
}
UILabel
s ไม่ถือว่าข้อความของพวกเขาเป็น HTML