ฉันต้องการแสดงสตริงเช่นนี้ในUILabel
:
มี 5 ผลลัพธ์
โดยที่หมายเลข 5 เป็นสีแดงและส่วนที่เหลือของสตริงเป็นสีดำ
ฉันจะทำสิ่งนี้ในรหัสได้อย่างไร?
ฉันต้องการแสดงสตริงเช่นนี้ในUILabel
:
มี 5 ผลลัพธ์
โดยที่หมายเลข 5 เป็นสีแดงและส่วนที่เหลือของสตริงเป็นสีดำ
ฉันจะทำสิ่งนี้ในรหัสได้อย่างไร?
คำตอบ:
วิธีทำคือใช้NSAttributedString
ดังนี้
NSMutableAttributedString *text =
[[NSMutableAttributedString alloc]
initWithAttributedString: label.attributedText];
[text addAttribute:NSForegroundColorAttributeName
value:[UIColor redColor]
range:NSMakeRange(10, 1)];
[label setAttributedText: text];
ฉันได้ทำสิ่งนี้โดยการสร้างcategory
สำหรับNSMutableAttributedString
-(void)setColorForText:(NSString*) textToFind withColor:(UIColor*) color
{
NSRange range = [self.mutableString rangeOfString:textToFind options:NSCaseInsensitiveSearch];
if (range.location != NSNotFound) {
[self addAttribute:NSForegroundColorAttributeName value:color range:range];
}
}
ใช้แล้วชอบ
- (void) setColoredLabel
{
NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@"Here is a red blue and green text"];
[string setColorForText:@"red" withColor:[UIColor redColor]];
[string setColorForText:@"blue" withColor:[UIColor blueColor]];
[string setColorForText:@"green" withColor:[UIColor greenColor]];
mylabel.attributedText = string;
}
SWIFT 3
extension NSMutableAttributedString{
func setColorForText(_ textToFind: String, with color: UIColor) {
let range = self.mutableString.range(of: textToFind, options: .caseInsensitive)
if range.location != NSNotFound {
addAttribute(NSForegroundColorAttributeName, value: color, range: range)
}
}
}
การใช้งาน
func setColoredLabel() {
let string = NSMutableAttributedString(string: "Here is a red blue and green text")
string.setColorForText("red", with: #colorLiteral(red: 0.9254902005, green: 0.2352941185, blue: 0.1019607857, alpha: 1))
string.setColorForText("blue", with: #colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1))
string.setColorForText("green", with: #colorLiteral(red: 0.3411764801, green: 0.6235294342, blue: 0.1686274558, alpha: 1))
mylabel.attributedText = string
}
SWIFT 4 @ kj13 ขอบคุณที่แจ้งให้ทราบ
// If no text is send, then the style will be applied to full text
func setColorForText(_ textToFind: String?, with color: UIColor) {
let range:NSRange?
if let text = textToFind{
range = self.mutableString.range(of: text, options: .caseInsensitive)
}else{
range = NSMakeRange(0, self.length)
}
if range!.location != NSNotFound {
addAttribute(NSAttributedStringKey.foregroundColor, value: color, range: range!)
}
}
ฉันได้ทำการทดลองเพิ่มเติมเกี่ยวกับคุณสมบัติและด้านล่างนี้คือผลลัพธ์นี่คือ SOURCECODE
นี่คือผลลัพธ์
จัดให้เลย
NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString:lblTemp.text];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0,5)];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(5,6)];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(11,5)];
lblTemp.attributedText = string;
สวิฟต์ 4
// An attributed string extension to achieve colors on text.
extension NSMutableAttributedString {
func setColor(color: UIColor, forText stringValue: String) {
let range: NSRange = self.mutableString.range(of: stringValue, options: .caseInsensitive)
self.addAttribute(NSAttributedStringKey.foregroundColor, value: color, range: range)
}
}
// Try it with label
let label = UILabel()
label.frame = CGRect(x: 70, y: 100, width: 260, height: 30)
let stringValue = "There are 5 results."
let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: stringValue)
attributedString.setColor(color: UIColor.red, forText: "5")
label.font = UIFont.systemFont(ofSize: 26)
label.attributedText = attributedString
self.view.addSubview(label)
ผลลัพธ์
สวิฟต์ 3
func setColoredLabel() {
var string: NSMutableAttributedString = NSMutableAttributedString(string: "redgreenblue")
string.setColor(color: UIColor.redColor(), forText: "red")
string.setColor(color: UIColor.greenColor(), forText: "green")
string.setColor(color: UIColor.blueColor(, forText: "blue")
mylabel.attributedText = string
}
func setColor(color: UIColor, forText stringValue: String) {
var range: NSRange = self.mutableString.rangeOfString(stringValue, options: NSCaseInsensitiveSearch)
if range != nil {
self.addAttribute(NSForegroundColorAttributeName, value: color, range: range)
}
}
ผลลัพธ์:
//NSString *myString = @"I have to replace text 'Dr Andrew Murphy, John Smith' ";
NSString *myString = @"Not a member?signin";
//Create mutable string from original one
NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:myString];
//Fing range of the string you want to change colour
//If you need to change colour in more that one place just repeat it
NSRange range = [myString rangeOfString:@"signin"];
[attString addAttribute:NSForegroundColorAttributeName value:[UIColor colorWithRed:(63/255.0) green:(163/255.0) blue:(158/255.0) alpha:1.0] range:range];
//Add it to the label - notice its not text property but it's attributeText
_label.attributedText = attString;
ตั้งแต่iOS 6 UIKit รองรับการวาดสตริงที่มาจากแหล่งข้อมูลดังนั้นจึงไม่จำเป็นต้องมีการขยายหรือเปลี่ยน
จากUILabel
:
@property(nonatomic, copy) NSAttributedString *attributedText;
คุณเพียงแค่ต้องสร้างNSAttributedString
ไฟล์. โดยทั่วไปมีสองวิธี:
ต่อท้ายส่วนของข้อความที่มีแอตทริบิวต์เดียวกัน - สำหรับแต่ละส่วนให้สร้างหนึ่งNSAttributedString
อินสแตนซ์และต่อท้ายเข้าด้วยกันNSMutableAttributedString
สร้างข้อความที่มีการระบุแหล่งที่มาจากสตริงธรรมดาจากนั้นเพิ่มแอตทริบิวต์สำหรับช่วงที่กำหนด - ค้นหาช่วงของตัวเลขของคุณ (หรืออะไรก็ได้) และใช้แอตทริบิวต์สีที่แตกต่างกัน
Anups ตอบอย่างรวดเร็ว สามารถใช้ซ้ำได้จากทุกคลาส
ในไฟล์ที่รวดเร็ว
extension NSMutableAttributedString {
func setColorForStr(textToFind: String, color: UIColor) {
let range = self.mutableString.rangeOfString(textToFind, options:NSStringCompareOptions.CaseInsensitiveSearch);
if range.location != NSNotFound {
self.addAttribute(NSForegroundColorAttributeName, value: color, range: range);
}
}
}
ในตัวควบคุมมุมมองบางส่วน
let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: self.labelShopInYourNetwork.text!);
attributedString.setColorForStr("YOUR NETWORK", color: UIColor(red: 0.039, green: 0.020, blue: 0.490, alpha: 1.0));
self.labelShopInYourNetwork.attributedText = attributedString;
การมี UIWebView หรือ UILabel มากกว่าหนึ่งรายการอาจถือว่ามากเกินไปสำหรับสถานการณ์นี้
คำแนะนำของฉันจะใช้TTTAttributedLabelซึ่งเป็นดรอปแทนสำหรับ UILabel ที่สนับสนุนNSAttributedString ซึ่งหมายความว่าคุณสามารถใช้สไตล์ที่แตกต่างกับช่วงต่างๆในสตริงได้อย่างง่ายดาย
สำหรับการแสดงข้อความสั้น ๆ ที่จัดรูปแบบที่ไม่จำเป็นต้องแก้ไขได้Core Textคือวิธีที่จะไป มีโครงการโอเพนซอร์สหลายโครงการสำหรับป้ายกำกับที่ใช้NSAttributedString
และ Core Text สำหรับการแสดงผล ดูCoreTextAttributedLabelหรือOHAttributedLabelเช่น
NSAttributedString
คือหนทางที่จะไป คำถามต่อไปนี้มีคำตอบที่ดีซึ่งจะแสดงให้คุณเห็นว่าต้องทำอย่างไรคุณใช้ NSAttributedString ได้อย่างไร
JTAttributedLabel (โดย mystcolor) ช่วยให้คุณสามารถใช้การสนับสนุนสตริงที่แสดงใน UILabel ภายใต้ iOS 6 และในเวลาเดียวกันคลาส JTAttributedLabel ภายใต้ iOS 5 ผ่าน JTAutoLabel
มีโซลูชัน Swift 3.0
extension UILabel{
func setSubTextColor(pSubString : String, pColor : UIColor){
let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: self.text!);
let range = attributedString.mutableString.range(of: pSubString, options:NSString.CompareOptions.caseInsensitive)
if range.location != NSNotFound {
attributedString.addAttribute(NSForegroundColorAttributeName, value: pColor, range: range);
}
self.attributedText = attributedString
}
}
และมีตัวอย่างการโทร:
let colorString = " (string in red)"
self.mLabel.text = "classic color" + colorString
self.mLabel.setSubTextColor(pSubString: colorString, pColor: UIColor.red)
Swift 4 ขึ้นไป:ได้รับแรงบันดาลใจจากโซลูชันของ anoop4realนี่คือส่วนขยาย String ที่สามารถใช้สร้างข้อความที่มี 2 สีที่แตกต่างกัน
extension String {
func attributedStringForPartiallyColoredText(_ textToFind: String, with color: UIColor) -> NSMutableAttributedString {
let mutableAttributedstring = NSMutableAttributedString(string: self)
let range = mutableAttributedstring.mutableString.range(of: textToFind, options: .caseInsensitive)
if range.location != NSNotFound {
mutableAttributedstring.addAttribute(NSAttributedStringKey.foregroundColor, value: color, range: range)
}
return mutableAttributedstring
}
}
ตัวอย่างต่อไปนี้จะเปลี่ยนสีของเครื่องหมายดอกจันเป็นสีแดงในขณะที่ยังคงสีป้ายต้นฉบับไว้สำหรับข้อความที่เหลือ
label.attributedText = "Enter username *".attributedStringForPartiallyColoredText("*", with: #colorLiteral(red: 1, green: 0, blue: 0, alpha: 1))
คำตอบของฉันยังมีตัวเลือกในการระบายสีการเกิดขึ้นของข้อความทั้งหมดไม่เพียงแค่การเกิดขึ้นครั้งเดียว: "wa ba wa ba dubdub" คุณสามารถกำหนดสีของ wa ทั้งหมดได้ไม่เพียง แต่การเกิดขึ้นครั้งแรกเช่นคำตอบที่ยอมรับ
extension NSMutableAttributedString{
func setColorForText(_ textToFind: String, with color: UIColor) {
let range = self.mutableString.range(of: textToFind, options: .caseInsensitive)
if range.location != NSNotFound {
addAttribute(NSForegroundColorAttributeName, value: color, range: range)
}
}
func setColorForAllOccuranceOfText(_ textToFind: String, with color: UIColor) {
let inputLength = self.string.count
let searchLength = textToFind.count
var range = NSRange(location: 0, length: self.length)
while (range.location != NSNotFound) {
range = (self.string as NSString).range(of: textToFind, options: [], range: range)
if (range.location != NSNotFound) {
self.addAttribute(NSForegroundColorAttributeName, value: color, range: NSRange(location: range.location, length: searchLength))
range = NSRange(location: range.location + range.length, length: inputLength - (range.location + range.length))
}
}
}
}
ตอนนี้คุณสามารถทำได้:
let message = NSMutableAttributedString(string: "wa ba wa ba dubdub")
message.setColorForText(subtitle, with: UIColor.red)
// or the below one if you want all the occurrence to be colored
message.setColorForAllOccuranceOfText("wa", with: UIColor.red)
// then you set this attributed string to your label :
lblMessage.attributedText = message
สำหรับผู้ใช้XamarinฉันมีC #แบบคงที่ที่ซึ่งฉันส่งผ่านอาร์เรย์ของสตริงอาร์เรย์ของ UIColours และอาร์เรย์ของ UIFonts (พวกเขาจะต้องจับคู่ความยาว) จากนั้นสตริงที่ประกอบจะถูกส่งกลับ
ดู:
public static NSMutableAttributedString GetFormattedText(string[] texts, UIColor[] colors, UIFont[] fonts)
{
NSMutableAttributedString attrString = new NSMutableAttributedString(string.Join("", texts));
int position = 0;
for (int i = 0; i < texts.Length; i++)
{
attrString.AddAttribute(new NSString("NSForegroundColorAttributeName"), colors[i], new NSRange(position, texts[i].Length));
var fontAttribute = new UIStringAttributes
{
Font = fonts[i]
};
attrString.AddAttributes(fontAttribute, new NSRange(position, texts[i].Length));
position += texts[i].Length;
}
return attrString;
}
ในกรณีของฉันฉันใช้ Xcode 10.1 มีตัวเลือกในการสลับระหว่างข้อความธรรมดาและข้อความที่มีการระบุแหล่งที่มาในข้อความป้ายกำกับในตัวสร้างอินเทอร์เฟซ
หวังว่านี่อาจช่วยคนอื่นได้ .. !
extension UILabel{
func setSubTextColor(pSubString : String, pColor : UIColor){
let attributedString: NSMutableAttributedString = self.attributedText != nil ? NSMutableAttributedString(attributedString: self.attributedText!) : NSMutableAttributedString(string: self.text!);
let range = attributedString.mutableString.range(of: pSubString, options:NSString.CompareOptions.caseInsensitive)
if range.location != NSNotFound {
attributedString.addAttribute(NSForegroundColorAttributeName, value: pColor, range: range);
}
self.attributedText = attributedString
}
}
วิธีแก้ปัญหาของฉันเองถูกสร้างขึ้นวิธีการเช่นเดียวกับวิธีถัดไป:
-(void)setColorForText:(NSString*) textToFind originalText:(NSString *)originalString withColor:(UIColor*)color andLabel:(UILabel *)label{
NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:originalString];
NSRange range = [originalString rangeOfString:textToFind];
[attString addAttribute:NSForegroundColorAttributeName value:color range:range];
label.attributedText = attString;
if (range.location != NSNotFound) {
[attString addAttribute:NSForegroundColorAttributeName value:color range:range];
}
label.attributedText = attString; }
ใช้งานได้กับสีที่ต่างกันเพียงสีเดียวในข้อความเดียวกัน แต่คุณสามารถปรับให้เข้ากับสีอื่น ๆ ในประโยคเดียวกันได้อย่างง่ายดาย
โดยใช้โค้ดด้านล่างนี้คุณสามารถกำหนดสีได้หลายสีตามคำ
NSMutableArray * array = [[NSMutableArray alloc] initWithObjects:@"1 ball",@"2 ball",@"3 ball",@"4 ball", nil];
NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] init];
for (NSString * str in array)
{
NSMutableAttributedString * textstr = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@ ,",str] attributes:@{NSForegroundColorAttributeName :[self getRandomColor]}];
[attStr appendAttributedString:textstr];
}
UILabel *lab = [[UILabel alloc] initWithFrame:CGRectMake(10, 300, 300, 30)];
lab.attributedText = attStr;
[self.view addSubview:lab];
-(UIColor *) getRandomColor
{
CGFloat redcolor = arc4random() % 255 / 255.0;
CGFloat greencolor = arc4random() % 255 / 255.0;
CGFloat bluencolor = arc4random() % 255 / 255.0;
return [UIColor colorWithRed:redcolor green:greencolor blue:bluencolor alpha:1.0];
}
SwiftRichString
ทำงานได้สมบูรณ์แบบ! คุณสามารถใช้+
เพื่อเชื่อมต่อสตริงที่มีแอตทริบิวต์สองรายการ