2013-04-10 303 views
3

我創建了一個可變的字符串,像@「testMeIn:綠彩:不同:綠彩:顏色設置NSAttributed字符串屬性覆蓋子屬性

NSMutableAttributedString *mutableText = [[NSMutableAttributedString alloc] initWithAttributedString:myString]; 

UIColor *foregroundColor = [UIColor blackColor]; 
NSString *key = NSForegroundColorAttributeName; 

[mutableText addAttribute:key value:foregroundColor range:NSMakeRange(0, myString.length)]; 

當我添加屬性foregroundColor,現有的綠色子字符中的顏色被指定的黑色顏色覆蓋。雖然我可以更改代碼以設置子字符串的綠色,但我想知道是否有任何其他方式將樣式應用於沒有樣式但沒有覆蓋現有樣式的字符串部分。

回答

4

您可以枚舉字符串中的每個屬性跨度,只有改變屬性,如果他們尚未設置

NSMutableAttributedString* aString = 
[[NSMutableAttributedString alloc] initWithString:@"testMeIn DIFFERENT Colors"]; 

[aString setAttributes:@{NSForegroundColorAttributeName:[UIColor greenColor]} 
        range:(NSRange){9,9}]; 

[aString enumerateAttributesInRange:(NSRange){0,aString.length} 
          options:nil 
          usingBlock: 
    ^(NSDictionary* attrs, NSRange range, BOOL *stop) { 

      //unspecific: don't change text color if ANY attributes are set 
     if ([[attrs allKeys] count]==0) 
      [aString addAttribute:NSForegroundColorAttributeName 
          value:[UIColor redColor] 
          range:range]; 

     //specific: don't change text color if text color attribute is already set 
     if (![[attrs allKeys] containsObject:NSForegroundColorAttributeName]) 
      [aString addAttribute:NSForegroundColorAttributeName 
          value:[UIColor redColor] 
          range:range]; 
    }]; 

enter image description here

+0

謝謝,這應該工作。 但是,如果風格經常改變,恐怕會變成一個代價高昂的操作。並且在一個冗長的字符串中添加不同的樣式。 – Friendtam 2013-04-19 09:56:15