NSAttributedString ile dize rengi değiştirilsin mi?


148

Kaydırıcının değerine bağlı olarak şu dizeleri görüntüleyen anket için bir kaydırıcım var: "Çok Kötü, Kötü, Tamam, İyi, Çok İyi".

Kaydırıcının kodu şöyledir:

- (IBAction) sliderValueChanged:(UISlider *)sender {
    scanLabel.text = [NSString stringWithFormat:@" %.f", [sender value]];
    NSArray *texts=[NSArray arrayWithObjects:@"Very Bad", @"Bad", @"Okay", @"Good", @"Very Good", @"Very Good", nil];
    NSInteger sliderValue=[sender value]; //make the slider value in given range integer one.
    self.scanLabel.text=[texts objectAtIndex:sliderValue];
}

"Çok Kötü" nin kırmızı, "Kötü" ün turuncu, "Tamam" ın sarı, "İyi" ve "Çok İyi" nin yeşil olmasını istiyorum.

Bunu yapmak için nasıl kullanacağımı anlamıyorum NSAttributedString.



Bir UISlider mı demek istiyorsun? Bunun bir etiketi yok. Yani temelde bir yazı tipi rengine sahip bir UILabel hakkında? Yoksa metnin bir bölümünü renkli mi istiyorsunuz?
Roger


Bu kütüphaneyi kullanın, çok basit. github.com/iOSTechHub/AttributedString
Ashish Chauhan 21

Yanıtlar:


200

Kullanmaya gerek yoktur NSAttributedString. İhtiyacınız olan tek şey, uygun olan basit bir etikettir textColor. Ayrıca bu basit çözüm, yalnızca iOS 6 değil, tüm iOS sürümleriyle çalışacaktır.

Ancak gereksiz yere kullanmak NSAttributedStringisterseniz, şöyle bir şey yapabilirsiniz:

UIColor *color = [UIColor redColor]; // select needed color
NSString *string = ... // the string to colorize
NSDictionary *attrs = @{ NSForegroundColorAttributeName : color };
NSAttributedString *attrStr = [[NSAttributedString alloc] initWithString:string attributes:attrs];
self.scanLabel.attributedText = attrStr;

4
Tüm olumsuz oyları anlamıyorum. Cevabım, ilişkilendirilmiş bir dize kullanmaktan çok daha basit. OP'nin NSAttributedStringbu görev için kullanmasına gerek yoktur . Etiketin metninin birden çok özniteliğe ihtiyaç duyması ama bu olmaması bir şey olurdu. Tüm etiketin bir seferde tek renk olması gerekir.
rmaddy

@ RubénE.Marín Ama sorun bu. OP yanlış bir şekilde çözümün kullanılması gerektiğini düşündü NSAttributedString. Demek istedikleri buydu. Asıl soru "Etiketin renginin değerine göre nasıl ayarlanacağı" olmalıydı . Çözümün gerektirmediğini belirterek NSAttributedStringçok daha basit bir cevap gösterdim. Ve OP çok daha basit cevabımı kabul ederek kabul etti. OP gerçekten isteseydi NSAttributedString, cevabımı kabul etmezlerdi. Yani olumsuz oylar için bir neden yok. Doğru soruyu cevapladım ve OP kabul etti.
rmaddy

26
Bu durumda, soruyu NSAttributedString ile çözerdim ve bundan sonra, OP'nin özel durumu için daha basit ve daha verimli çözümünüze işaret ederdim. Bu soruya gelen insanlar, NSAttributedString'de metin rengini değiştirmenin yollarını aradıkları için (ve bu sizin olumsuz oylarınızı açıklar) çözümünüzden hayal kırıklığına uğrayabilir.
Ruben Marin 15

16
Rubén haklı: Buraya geldim çünkü atfedilen bir dizgede rengi ayarlamam gerekiyor, çünkü birden çok renk ve yazı tipi boyutuna sahip bileşik bir ilişkilendirilmiş dize oluşturuyorum. Ve ihtiyacım olan anahtar bilgi parçası NSForegroundColorAttributeName, Apple belgelerinde bulmakta zorlandığım anahtardı.
Erik van der Neut

6
Hala soruyu yanıtladığınız için teşekkür ederiz !! OP'nin gerçekten ihtiyacı olmasa bile. Pek çok kez bir şeyi google'da aradım, tam olarak aradığım şey bir yığın taşma sorusuyla sonuçlandı, yalnızca soruyu yanıtlayan bilge kıçın OP'nin aslında soru başlığının sorduğu şeye ihtiyaç duymadığına karar verdiğini ve tamamen farklı bir soruyu yanıtladı. Gelecekte, 1 OP'nin aksine 1000'in çıkabileceği arama sonuçlarından gelen kişiler, aslında yazının başlığında sorulan soruya bir çözüm isteyebilir. </rant>
danny

113

Bunun gibi bir şey kullanın (Derleyici işaretlenmedi)

NSMutableAttributedString *string = [[NSMutableAttributedString alloc]initWithString:self.text.text];
NSRange range=[self.myLabel.text rangeOfString:texts[sliderValue]]; //myLabel is the outlet from where you will get the text, it can be same or different

NSArray *colors=@[[UIColor redColor],
                  [UIColor redColor],
                  [UIColor yellowColor],
                  [UIColor greenColor]
                 ];

[string addAttribute:NSForegroundColorAttributeName 
               value:colors[sliderValue] 
               range:range];           

[self.scanLabel setAttributedText:texts[sliderValue]];

Hey Anoop, seni tekrar gördüğüme sevindim! Sağladığınız kodu işledim, self.text.text'i self.scanLabel.text ile değiştirdim, ancak "word" de bir hata alıyorum. Şanssız olarak @ "Çok Kötü" ile değiştirmeyi denedim.
Adam

Cevabımı buradan kopyaladım stackoverflow.com/questions/14231879/…
Anoop Vaidya

Teşekkürler Anoop, ama benim için şans yok. - [__ NSCFString _ui_synthesizeAttributedSubstringFromRange: usingDefaultAttributes:]: 0x1f845af0 2013-01-11 16: 27: 34.939 yellaProto [7829: 907] örneğine gönderilen tanınmayan seçici - 'NSC' NSInvalidArgument istisnası nedeniyle uygulama sonlandırılıyor _ui_synthesizeAttributedSubstringFromRange: usingDefaultAttributes:]: 0x1f845af0 'örneğine tanınmayan seçici gönderildi
Adam

Sadece "metinlerin" ne olduğunu anlamaya
çalışın

@Morkrom: Bu cevapta 2. yorumu görürseniz, o zaman öğreneceksiniz: p
Anoop Vaidya

49

In Swift 4 :

// Custom color
let greenColor = UIColor(red: 10/255, green: 190/255, blue: 50/255, alpha: 1)
// create the attributed colour
let attributedStringColor = [NSAttributedStringKey.foregroundColor : greenColor];
// create the attributed string
let attributedString = NSAttributedString(string: "Hello World!", attributes: attributedStringColor)
// Set the label
label.attributedText = attributedString

In Swift 3 :

// Custom color
let greenColor = UIColor(red: 10/255, green: 190/255, blue: 50/255, alpha: 1)
// create the attributed color
let attributedStringColor : NSDictionary = [NSForegroundColorAttributeName : greenColor];
// create the attributed string
let attributedString = NSAttributedString(string: "Hello World!", attributes: attributedStringColor as? [String : AnyObject])
// Set the label
label.attributedText = attributedString 

Zevk almak.


29

For Swift 5:

var attributes = [NSAttributedString.Key: AnyObject]()
attributes[.foregroundColor] = UIColor.red

let attributedString = NSAttributedString(string: "Very Bad", attributes: attributes)

label.attributedText = attributedString

For Swift 4:

var attributes = [NSAttributedStringKey: AnyObject]()
attributes[.foregroundColor] = UIColor.red

let attributedString = NSAttributedString(string: "Very Bad", attributes: attributes)

label.attributedText = attributedString

For Swift 3:

var attributes = [String: AnyObject]()
attributes[NSForegroundColorAttributeName] = UIColor.red

let attributedString = NSAttributedString(string: "Very Bad", attributes: attributes)

label.attributedText = attributedString

7

Yaratabilirsin NSAttributedString

NSDictionary *attributes = @{ NSForegroundColorAttributeName : [UIColor redColor] };
NSAttributedString *attrStr = [[NSAttributedString alloc] initWithString:@"My Color String" attributes:attrs];

VEYA NSMutableAttributedStringAralıklarla özel öznitelikler uygulamak için.

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@%@", methodPrefix, method] attributes: @{ NSFontAttributeName : FONT_MYRIADPRO(48) }];
[attributedString addAttribute:NSFontAttributeName value:FONT_MYRIADPRO_SEMIBOLD(48) range:NSMakeRange(methodPrefix.length, method.length)];

Kullanılabilir Özellikler: NSAttributedStringKey


GÜNCELLEME:

Swift 5.1

let message: String = greeting + someMessage
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 2.0
    
// Note: UIFont(appFontFamily:ofSize:) is extended init.
let regularAttributes: [NSAttributedString.Key : Any] = [.font : UIFont(appFontFamily: .regular, ofSize: 15)!, .paragraphStyle : paragraphStyle]
let boldAttributes = [NSAttributedString.Key.font : UIFont(appFontFamily: .semiBold, ofSize: 15)!]

let mutableString = NSMutableAttributedString(string: message, attributes: regularAttributes)
mutableString.addAttributes(boldAttributes, range: NSMakeRange(0, greeting.count))

5

Swift 4 ile NSAttributedStringKeystatik özelliği vardır foregroundColor. foregroundColoraşağıdaki beyana sahiptir:

static let foregroundColor: NSAttributedStringKey

Bu niteliğin değeri bir UIColornesnedir. Oluşturma sırasında metnin rengini belirtmek için bu niteliği kullanın. Bu niteliği belirtmezseniz, metin siyah olarak oluşturulur.

Aşağıdaki Playground kodu, aşağıdakilerle bir NSAttributedStringörneğin metin renginin nasıl ayarlanacağını gösterir foregroundColor:

import UIKit

let string = "Some text"
let attributes = [NSAttributedStringKey.foregroundColor : UIColor.red]
let attributedString = NSAttributedString(string: string, attributes: attributes)

Gösterileri Aşağıdaki kod olası UIViewControllerdayanır uygulama NSAttributedStringbir metin ve metin rengini güncellemek için UILabelbir den UISlider:

import UIKit

enum Status: Int {
    case veryBad = 0, bad, okay, good, veryGood

    var display: (text: String, color: UIColor) {
        switch self {
        case .veryBad:  return ("Very bad", .red)
        case .bad:      return ("Bad", .orange)
        case .okay:     return ("Okay", .yellow)
        case .good:     return ("Good", .green)
        case .veryGood: return ("Very good", .blue)
        }
    }

    static let minimumValue = Status.veryBad.rawValue
    static let maximumValue = Status.veryGood.rawValue
}
final class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var slider: UISlider!
    var currentStatus: Status = Status.veryBad {
        didSet {
            // currentStatus is our model. Observe its changes to update our display
            updateDisplay()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Prepare slider
        slider.minimumValue = Float(Status.minimumValue)
        slider.maximumValue = Float(Status.maximumValue)

        // Set display
        updateDisplay()
    }

    func updateDisplay() {
        let attributes = [NSAttributedStringKey.foregroundColor : currentStatus.display.color]
        let attributedString = NSAttributedString(string: currentStatus.display.text, attributes: attributes)
        label.attributedText = attributedString
        slider.value = Float(currentStatus.rawValue)
    }

    @IBAction func updateCurrentStatus(_ sender: UISlider) {
        let value = Int(sender.value.rounded())
        guard let status = Status(rawValue: value) else { fatalError("Could not get Status object from value") }
        currentStatus = status
    }

}

Bununla birlikte, NSAttributedStringböyle bir örnek için gerçekten kullanmanıza gerek olmadığını ve sadece UILabel's textve textColorözelliklerine güvenebileceğinizi unutmayın . Bu nedenle, updateDisplay()uygulamanızı aşağıdaki kodla değiştirebilirsiniz:

func updateDisplay() {
    label.text = currentStatus.display.text
    label.textColor = currentStatus.display.color
    slider.value = Float(currentStatus.rawValue)
}

2

Swift 4.2 Güncellemesi

var attributes = [NSAttributedString.Key: AnyObject]()

attributes[.foregroundColor] = UIColor.blue

let attributedString = NSAttributedString(string: "Very Bad",
attributes: attributes)

label.attributedText = attributedString

1

Swift için bir satır:

NSAttributedString(string: "Red Text", attributes: [.foregroundColor: UIColor.red])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.