NSForegroundColorAttributeName 不适用于 UILabel

NSForegroundColorAttributeName not working for UILabel

我在使用 "NSForegroundColorAttributeName" 更改子字符串颜色时遇到问题。我很困惑,因为正在应用同一子字符串的其他属性(下划线)。

还尝试使用已弃用的属性 "UITextAttributeTextColor" 和其他建议的属性 "kCTForegroundColorAttributeName" 并获得了相同的效果。

我正在为 iOS 7.

编译

    NSString *freeText = [NSString stringWithFormat:@"(%@)", self.me.activity.text];

    int lblMaxWidth = arrImgView.origin.x - WPRConstraints.BorderOffset;
    int lblMaxHeight = self.activityView.size.height - WPRConstraints.BorderOffset * 2;

    RevUILabel *addActivityLbl = [[RevUILabel alloc] initWithFontNameMultiLine:[WPRFonts LattoBold]
                                                                          size:16
                                                                 sizeConstrain:CGSizeMake(lblMaxWidth,lblMaxHeight)];

    addActivityLbl.text = [NSString stringWithFormat:@"%@ %@", Translate(self.me.activity.activityKey), freeText] ;
    addActivityLbl.textColor = BlackColor;

    NSMutableAttributedString *str = [addActivityLbl.attributedText mutableCopy];



    [str addAttribute:NSUnderlineColorAttributeName  value:[UIColor redColor] range:[addActivityLbl.text rangeOfString:freeText]];
    [str addAttribute:NSUnderlineStyleAttributeName  value:[NSNumber numberWithInteger:1] range:[addActivityLbl.text rangeOfString:freeText]];

    [str addAttribute:NSForegroundColorAttributeName
                        value:[UIColor redColor]
                range:[addActivityLbl.text rangeOfString:freeText]];


    addActivityLbl.attributedText = str;


    addActivityLbl.frame = CGRectMake(WPRConstraints.BorderOffset,
                                      WPRConstraints.BorderOffset,
                                      addActivityLbl.size.width,
                                      addActivityLbl.size.height);
    [self.activityView addSubview:addActivityLbl];

问题出在这一行:
NSMutableAttributedString *str = [addActivityLbl.attributedText mutableCopy];

我不知道你代码的前几行,但 addActivityLbl.attributedText 可能是空的。

其次,NSAttributedStringUILabel 一起使用不如与 UITextView 一起使用可靠。如果未明确提供属性,UILabelattributedText 会继承 UILabeltext 的属性。

你的 addActivityLbl.textColor 是黑色的。而你还没有设置你的addActivityLbl.attributedText ForegroundColorAttribute。这意味着您的 addActivityLbl.attributedText 将从您的 addActivityLbl.textColor.

继承 BlackColor

此行将无法按预期工作;因为你还没有设置你的addActivityLbl.attributedTextfreeText 还没有范围。

[str addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:[addActivityLbl.text rangeOfString:freeText]];

底层之所以有效,是因为底层不是 addActivityLbl.text 的 属性(未被 attributedText 继承)。

我建议你改用UITextView(这样更安全)。另一种选择是在引用它的某个范围之前设置你的label.attributedText

确保您没有在 UILabel textColor 属性 上设置颜色 [=12] =].

我在尝试设置 UIButton 属性标题的颜色时遇到了类似的问题。我正在应用其他属性,如下划线,它们起作用了,但 NSForegroundColorAttributeName 属性完全没有效果。

在拔头发并质疑自己的理智之后,我最终发现我的问题是在情节提要中,我的按钮被设置为 System 按钮:

而且必须是 Custom:

在故事板中更改该设置后,我能够设置 NSForegroundColorAttributeName 具有预期的正常行为。

我希望这对某人有所帮助!