Bunun gibi bir dizeyi a UILabel
:
5 sonuç var.
5 sayısının kırmızı renkte olduğu ve dizenin geri kalanının siyah olduğu yerde.
Bunu kodla nasıl yapabilirim?
Bunun gibi bir dizeyi a UILabel
:
5 sonuç var.
5 sayısının kırmızı renkte olduğu ve dizenin geri kalanının siyah olduğu yerde.
Bunu kodla nasıl yapabilirim?
Yanıtlar:
Bunu yapmanın yolu şu şekilde kullanmaktır NSAttributedString
:
NSMutableAttributedString *text =
[[NSMutableAttributedString alloc]
initWithAttributedString: label.attributedText];
[text addAttribute:NSForegroundColorAttributeName
value:[UIColor redColor]
range:NSMakeRange(10, 1)];
[label setAttributedText: text];
Bunu UILabel
yapmak için bir uzantı oluşturdum .
Bunu bir category
for oluşturarak yaptımNSMutableAttributedString
-(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];
}
}
Gibi kullan
- (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)
}
}
}
KULLANIM
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 Bildirim için teşekkürler
// 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!)
}
}
Özniteliklerle daha fazla deney yaptım ve sonuçlar aşağıdadır, işte SOURCECODE
İşte sonuç
Hadi bakalım
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)
Sonuç
Hızlı 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)
}
}
Sonuç:
//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;
İOS 6'dan beriİOS UIKit, çizimle ilişkilendirilmiş dizeleri desteklediğinden, herhangi bir uzatma veya değiştirme gerekmez.
Kimden UILabel
:
@property(nonatomic, copy) NSAttributedString *attributedText;
Sadece kendi NSAttributedString
. Temel olarak iki yol vardır:
Aynı niteliklere sahip metin parçaları ekleyin - her bölüm için bir NSAttributedString
örnek oluşturun ve bunları bir örneğe ekleyinNSMutableAttributedString
Düz dizeden ilişkilendirilmiş metin oluşturun ve ardından belirli aralıklar için ilişkilendirilmiş metin ekleyin - numaranızın aralığını (veya her neyse) bulun ve buna farklı renk özelliği uygulayın.
Anups hızla cevap verir. Herhangi bir sınıftan yeniden kullanılabilir.
Hızlı dosyada
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);
}
}
}
Bazı görünüm denetleyicisinde
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;
Bir UIWebView veya birden fazla UILabel'e sahip olmak, bu durum için gereğinden fazla kabul edilebilir.
Benim önerim kullanmak olacaktır TTTAttributedLabel bir açılan yerine UILabel için destekler olduğunu NSAttributedString . Bu, bir dizedeki farklı aralıklara farklı stilleri kolayca uygulayabileceğiniz anlamına gelir.
Düzenlenebilir olması gerekmeyen kısa, biçimlendirilmiş metinleri görüntülemek için, Çekirdek Metin en iyi yoldur. NSAttributedString
Oluşturmak için Çekirdek Metin kullanan etiketler için birkaç açık kaynaklı proje vardır . Örneğin CoreTextAttributedLabel veya OHAttributedLabel'e bakın .
NSAttributedString
gidilecek yol. Aşağıdaki sorunun nasıl yapılacağını gösteren harika bir cevabı var NSAttributedString'i nasıl kullanıyorsunuz?
JTAttributedLabel ( mystcolor tarafından), iOS 6 altında UILabel'de atfedilen dize desteğini ve aynı zamanda JTAutoLabel aracılığıyla iOS 5 altındaki JTAttributedLabel sınıfını kullanmanıza izin verir.
Swift 3.0 çözümü var
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
}
}
Ve bir çağrı örneği var:
let colorString = " (string in red)"
self.mLabel.text = "classic color" + colorString
self.mLabel.setSubTextColor(pSubString: colorString, pColor: UIColor.red)
Swift 4 ve üstü: anoop4real'ın çözümünden esinlenerek , işte 2 farklı renkte metin oluşturmak için kullanılabilecek bir String uzantısı.
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
}
}
Aşağıdaki örnek, kalan metin için orijinal etiket rengini korurken yıldız işaretinin rengini kırmızıya dönüştürür.
label.attributedText = "Enter username *".attributedStringForPartiallyColoredText("*", with: #colorLiteral(red: 1, green: 0, blue: 0, alpha: 1))
Cevabım ayrıca bir metnin tüm oluşumunu renklendirme seçeneğine de sahiptir: "wa ba wa ba dubdub", wa'nın tüm oluşumunu sadece kabul edilen cevap gibi ilk kez değil, renklendirebilirsiniz.
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))
}
}
}
}
Şimdi bunu yapabilirsiniz:
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
İçin Xamarin kullanıcıları bir statik var C # bir dizi dizeyi, UIColours dizisini ve UIFonts dizisini (uzunluk olarak eşleşmeleri gerekecek) geçirdiğim yöntemim var. İlişkilendirilen dize daha sonra geri aktarılır.
görmek:
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;
}
Benim durumumda Xcode 10.1 kullanıyorum. Arayüz Oluşturucu'da Etiket metninde düz metin ile İlişkilendirilmiş metin arasında geçiş yapma seçeneği vardır.
Umarım bu başka birine yardımcı olabilir ..!
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
}
}
Kendi çözümüm, bir sonraki gibi bir yöntem yarattı:
-(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; }
Aynı metinde yalnızca bir farklı renkle çalıştı, ancak aynı cümle içinde daha fazla renge kolayca uyarlayabilirsiniz.
Aşağıdaki kodu kullanarak kelimeye göre birden fazla renk ayarlayabilirsiniz.
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
mükemmel çalışıyor! +
İki öznitelikli dizeyi birleştirmek için kullanabilirsiniz