随时随地在UILabel.attributedText上应用不同的属性

时间:2018-02-20 23:19:01

标签: ios swift uilabel nsattributedstring

我正在使用Swift 4,使用Xcode 9.2。

我有一个UILabel,它在.attributedText属性中与NSMutableAttributedString相关联。事实上,这个NSMutableAttributedString是由两个不同NSMutableAttributedString的串联组成的,每个人都有不同的属性。

由于使用append()我将所有NSMutableAttributedString合并到一个可变字符串中,如何在追加所有内容之前检索我之前设置的属性范围(可能无法完成)?或者,有一种方法可以在NSMutableAttributedString内放置UILabel.attributedText以上的内容?或者,我是否可以在不使用UILabel的情况下获得此行为(例如,可能使用UITextView)?

这是我遇到的问题,因为我需要添加一个UISwitch隐藏(=将其恢复为默认黑色)并再次显示此foregroundColor的{​​{1}},但由于此字符串中只有一部分具有NSMutableAttributedString属性,因此我不能简单地将该属性应用于整个字符串。

这是代码:

foregroundColor

我想到了这个func attributedTest (_ testString : String) { // the first NSMutableAttributedString created let firstString = NSMutableAttributedString( string: testString, attributes: [NSAttributedStringKey.font : UIFont( name: "Futura", size: 20.0)!]) // the second NSMutableAttributedString created, they're equal let secondString = NSMutableAttributedString( string: testString, attributes: [NSAttributedStringKey.font : UIFont( name: "Futura", size: 20.0)!]) // here I'm adding the attributed on test2 // the NSRange, in this case, is equal to the whole string secondString.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red, range: NSRangeFromString("0, \(testString.count)")) // here I'm appending the second string to the first one firstString.append(secondString) // here I'm setting the testLabel.attributedText testLabel.attributedText = test } 的简单副本,根本没有属性(NSMutableAttributedString在属性的外部,所以我并不担心),存储在某个地方。可以拥有这两个字符串,并在需要时通过UIFont切换它们是一个不错的解决方案(尽管不是最佳的)?

谢谢!

1 个答案:

答案 0 :(得分:0)

试试这个

     NSMutableAttributedString *mutableAttStr = [[NSMutableAttributedString alloc] init];
     NSString *str = @"your string here";
     NSDictionary *attributes = @{NSForegroundColorAttributeName : [UIColor redColor]};
     NSAttributedString *newAttStr = [[NSAttributedString alloc] initWithString:str attributes:attributes];
    [mutableAttStr appendAttributedString:newAttStr];
    testLabel.attributedText = mutableAttStr;