0

我正在使用 TTTAttributedLabel(https://github.com/mattt/TTTAttributedLabel)并使用它为括号中的内容设置斜体文本。问题是括号中的文本未设置为斜体。不知道我的错误在哪里..

代码如下所示:

static inline NSRegularExpression * ParenthesisRegularExpression() {
    static NSRegularExpression *_parenthesisRegularExpression = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _parenthesisRegularExpression = [[NSRegularExpression alloc] initWithPattern:@"\\([^\\(\\)]+\\)" options:NSRegularExpressionCaseInsensitive error:nil];
    });

    return _parenthesisRegularExpression;
}

-(TTTAttributedLabel*)setItalicTextForLabel:(TTTAttributedLabel*)attributedLabel fontSize:(float)Size stringToBeSet:(NSString*)string
{
    [attributedLabel setText:string afterInheritingLabelAttributesAndConfiguringWithBlock:^NSMutableAttributedString *(NSMutableAttributedString *mutableAttributedString)
    {
        NSRange stringRange = NSMakeRange(0, [mutableAttributedString length]);
        NSRegularExpression *regexp = ParenthesisRegularExpression();
        [regexp enumerateMatchesInString:[mutableAttributedString string] options:0 range:stringRange usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
            UIFont *italicSystemFont = [UIFont italicSystemFontOfSize:Size];
            CTFontRef italicFont = CTFontCreateWithName((__bridge CFStringRef)italicSystemFont.fontName, italicSystemFont.pointSize, NULL);
            if (italicFont) {
                [mutableAttributedString removeAttribute:(NSString *)kCTFontAttributeName range:result.range];
                [mutableAttributedString addAttribute:(NSString *)kCTFontAttributeName value:(__bridge id)italicFont range:result.range];
                CFRelease(italicFont);

                [mutableAttributedString removeAttribute:(NSString *)kCTForegroundColorAttributeName range:result.range];
                [mutableAttributedString addAttribute:(NSString*)kCTForegroundColorAttributeName value:(id)[[UIColor grayColor] CGColor] range:result.range];
            }
        }];

        return mutableAttributedString;
    }];
    return attributedLabel;
}

我这样称呼它:mylabel = [self setItalicTextForLabel:descriptionLabel fontSize:23 stringToBeSet:string];

需要一些关于我做错了什么的指导。

4

1 回答 1

3

我从来没有用过TTTAttributedLabel,我的经验NSAttributedString来自NSTextView在 OS X 上玩。

也就是说,为什么不稍微重构一下代码以NSAttributedString直接将 a 传递给setText:afterInheritingLabelAttributesAndConfiguringWithBlock:这种情况似乎在两年前就已经成为可能。

事实上,为什么不使用setText:?

设置标签显示的文本。

@param text标签显示的对象NSStringNSAttributedString如果指定的文本是 a NSString,则标签将显示类似 a 的文本UILabel,继承标签的文本样式。如果指定的文本是NSAttributedString,则标签文本样式将被属性字符串中指定的样式覆盖。

@discussion此方法覆盖UILabel -setText:以接受NSStringNSAttributedString对象。这个字符串是nil默认的。

我冒昧地重命名了您的方法并清理了代码。没有测试,当然,考虑到我没有TTTAttributedLabel可用的,并且懒得建立一个演示项目来回答这个问题:-)

-(void)applyItalicTextInParenthesisOfString:(NSString*)string
                                    toLabel:(TTTAttributedLabel*)attributedLabel
                                     fontSize:(float)size
{
    NSMutableAttributedString * mutableAttributedString = [[NSMutableAttributedString alloc] initWithString:string];
    NSRange stringRange = NSMakeRange(0, [mutableAttributedString length]);
    NSRegularExpression *regexp = ParenthesisRegularExpression();

    UIFont *italicSystemFont = [UIFont italicSystemFontOfSize:size];
    CTFontRef italicFont = CTFontCreateWithName((__bridge CFStringRef)italicSystemFont.fontName, italicSystemFont.pointSize, NULL);

    [regexp enumerateMatchesInString:[mutableAttributedString string] options:0 range:stringRange usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {

        if (italicFont)
        {
            // No need to remove an attribute; the string was already an
            // NSString, without any attributes.
            // [mutableAttributedString removeAttribute:(NSString *)kCTFontAttributeName range:result.range];
            // [mutableAttributedString removeAttribute:(NSString *)kCTForegroundColorAttributeName range:result.range];

            [mutableAttributedString addAttribute:(NSString *)kCTFontAttributeName value:(__bridge id)italicFont range:result.range];
            [mutableAttributedString addAttribute:(NSString*)kCTForegroundColorAttributeName value:(id)[[UIColor grayColor] CGColor] range:result.range];
        }
    }];

    CFRelease(italicFont);

    [attributedLabel setText:string]
}

我也有点过时,所以为了可读性,我会避免使用 ARC 和块。

于 2013-05-28T17:41:49.123 回答