Tôi muốn hiển thị một chuỗi như thế này trong UILabel
:
Có 5 kết quả.
Trong đó số 5 có màu đỏ và phần còn lại của dây màu đen.
Làm thế nào tôi có thể làm điều này trong mã?
Tôi muốn hiển thị một chuỗi như thế này trong UILabel
:
Có 5 kết quả.
Trong đó số 5 có màu đỏ và phần còn lại của dây màu đen.
Làm thế nào tôi có thể làm điều này trong mã?
Câu trả lời:
Cách làm là sử dụng NSAttributedString
như sau:
NSMutableAttributedString *text =
[[NSMutableAttributedString alloc]
initWithAttributedString: label.attributedText];
[text addAttribute:NSForegroundColorAttributeName
value:[UIColor redColor]
range:NSMakeRange(10, 1)];
[label setAttributedText: text];
Tôi đã tạo một UILabel
tiện ích mở rộng để làm việc đó .
Tôi đã làm điều này bằng cách tạo ra một category
choNSMutableAttributedString
-(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];
}
}
Sử dụng nó như
- (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)
}
}
}
SỬ DỤNG
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 Cảm ơn bạn đã thông báo
// 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!)
}
}
Tôi đã thực hiện nhiều thử nghiệm hơn với các thuộc tính và dưới đây là kết quả, đây là SOURCECODE
Đây là kết quả
Của bạn đây
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;
Swift 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)
Kết quả
Swift 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)
}
}
Kết quả:
//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;
Kể từ iOS 6 , UIKit hỗ trợ vẽ các chuỗi phân bổ, vì vậy không cần phần mở rộng hoặc thay thế.
Từ UILabel
:
@property(nonatomic, copy) NSAttributedString *attributedText;
Bạn chỉ cần xây dựng của bạn NSAttributedString
. Về cơ bản có hai cách:
Nối các đoạn văn bản có cùng thuộc tính - đối với mỗi phần, hãy tạo một NSAttributedString
phiên bản và nối chúng vào mộtNSMutableAttributedString
Tạo văn bản được phân bổ từ chuỗi thuần túy và sau đó thêm phân bổ cho các phạm vi nhất định - tìm phạm vi số của bạn (hoặc bất kỳ thứ gì) và áp dụng thuộc tính màu khác nhau trên đó.
Anups trả lời nhanh chóng. Có thể được sử dụng lại từ bất kỳ lớp nào.
Trong tệp nhanh chóng
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);
}
}
}
Trong một số chế độ xem bộ điều khiển
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;
Có một UIWebView hoặc nhiều UILabel có thể được coi là quá mức cần thiết cho tình huống này.
Đề xuất của tôi là sử dụng TTTAttributedLabel , đây là phần mềm thay thế cho UILabel hỗ trợ NSAttributedString . Điều này có nghĩa là bạn có thể rất dễ dàng áp dụng các kiểu khác nhau cho các phạm vi khác nhau trong một chuỗi.
Để hiển thị văn bản ngắn, được định dạng mà không cần phải chỉnh sửa, Core Text là lựa chọn phù hợp. Có một số dự án mã nguồn mở cho các nhãn sử dụng NSAttributedString
và Văn bản cốt lõi để hiển thị. Xem CoreTextAttributedLabel hoặc OHAttributedLabel chẳng hạn.
NSAttributedString
là con đường để đi. Câu hỏi sau có câu trả lời tuyệt vời cho bạn biết cách thực hiện Bạn sử dụng NSAttributedString như thế nào
JTAttributedLabel (bởi mystcolor) cho phép bạn sử dụng hỗ trợ chuỗi phân bổ trong UILabel trong iOS 6 và đồng thời lớp JTAttributedLabel trong iOS 5 thông qua JTAutoLabel của nó.
Có một giải pháp 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
}
}
Và có một ví dụ về cuộc gọi:
let colorString = " (string in red)"
self.mLabel.text = "classic color" + colorString
self.mLabel.setSubTextColor(pSubString: colorString, pColor: UIColor.red)
Swift 4 trở lên: Lấy cảm hứng từ giải pháp của anoop4real , đây là phần mở rộng Chuỗi có thể được sử dụng để tạo văn bản với 2 màu khác nhau.
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
}
}
Ví dụ sau thay đổi màu của dấu hoa thị thành màu đỏ trong khi vẫn giữ nguyên màu nhãn gốc cho văn bản còn lại.
label.attributedText = "Enter username *".attributedStringForPartiallyColoredText("*", with: #colorLiteral(red: 1, green: 0, blue: 0, alpha: 1))
Câu trả lời của tôi cũng có tùy chọn tô màu cho tất cả sự xuất hiện của một văn bản không chỉ một lần xuất hiện của nó: "wa ba wa ba dubdub", bạn có thể tô màu tất cả sự xuất hiện của wa không chỉ sự xuất hiện đầu tiên như câu trả lời được chấp nhận.
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))
}
}
}
}
Bây giờ bạn có thể làm điều này:
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
Đối với người dùng Xamarin, tôi có một phương thức C # tĩnh trong đó tôi truyền vào một mảng chuỗi, một mảng UIColours và mảng UIFonts (chúng sẽ cần phải khớp về độ dài). Chuỗi phân bổ sau đó sẽ được trả lại.
xem:
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;
}
Trong trường hợp của tôi, tôi đang sử dụng Xcode 10.1. Có một tùy chọn chuyển đổi giữa văn bản thuần túy và văn bản thuộc tính trong văn bản Nhãn trong Trình tạo giao diện
Hy vọng điều này có thể giúp ai đó khác ..!
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
}
}
Giải pháp của riêng tôi đã được tạo ra một phương pháp giống như phương pháp tiếp theo:
-(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; }
Nó hoạt động chỉ với một màu khác nhau trong cùng một văn bản nhưng bạn có thể dễ dàng điều chỉnh nó thành nhiều màu hơn trong cùng một câu.
Bằng cách sử dụng mã bên dưới, bạn có thể đặt nhiều màu dựa trên từ.
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
hoạt động hoàn hảo! Bạn có thể sử dụng +
để nối hai chuỗi phân bổ