首页 文章

从用户键入的属性字符串中查找属性

提问于
浏览
6

在我的应用程序中,用户将键入他想要的任何内容,并且可以将文本设置为Bold,Italic和Underline .

I am able to do the Text - 粗体,斜体和下划线 .

I need to find which Text (or Character) 是来自 user typed 的属性字符串的 Bold, Italic and Underline .

任何类型的链接,教程,代码都会有很大的帮助 .

EDIT :

我需要这样的结果......

如果字符6是斜体,则打印斜体 .
如果字符14是粗体,则打印粗体 .

我需要将所有文本从Calibri字体系列转换为HelveticaNeue字体系列而不更改其属性 .

1 回答

  • 13

    您可以使用此代码枚举属性(整个范围) .

    [attrStr enumerateAttributesInRange:NSMakeRange(0, [attrStr length]) options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired usingBlock:
             ^(NSDictionary *attributes, NSRange range, BOOL *stop) {
    //Do something here
                 }
             }];
    

    对于特定范围,您必须将代码 NSMakeRange(0, [attrStr lenght]) 更改为您需要的范围 .

    编辑后,您的具体需求,此代码应该做的工作:

    [attrStr enumerateAttributesInRange:NSMakeRange(0, [attrStr length])
                                options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired
                             usingBlock:
     ^(NSDictionary *attributes, NSRange range, BOOL *stop)
    {
         NSMutableDictionary *mutableAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes];
         UIFont *currentFont = [mutableAttributes objectForKey: NSFontAttributeName];
         UIFont *newFont;
         if ([[currentFont fontName] isEqualToString:@"Calibri-BoldItalic"])
             newFont = [UIFont fontWithName:@"HelveticaNeue-BoldItalic" size:currentFont.pointSize];
         else if ([[currentFont fontName] isEqualToString:@"Calibri-Bold"])
             newFont = [UIFont fontWithName:@"HelveticaNeue-Bold" size:currentFont.pointSize];
         else if ([[currentFont fontName] isEqualToString:@"Calibri-Italic"])
             newFont = [UIFont fontWithName:@"HelveticaNeue-Italic" size:currentFont.pointSize];
        [mutableAttributes setObject:newFont forKey:@"NSFont"];
        [attrStr setAttributes:mutableAttributes range:range];
     }];
    

    从你的评论中,你可能会看到更复杂的东西,所以我会给你一些想法/提示来做/检查 . 您只需完成我以前的代码即可管理所有案例 .
    •案例:没有字体 .
    你只需检查 currentFont 是否为零 . 如果是,您可以设置所需内容 . 由于没有斜体/粗体属性(因为它们是字体中的"included"),我建议您设置为 newFont :HelveticaNeue .
    •案例:它更加复杂 .
    我已经使用过了,在这里我得到了:字体名称(这是 postscript name )是这样的,用于HelveticaNeue(如给出的例子):

    HelveticaNeue HelveticaNeue-Light HelveticaNeue-UltraLight HelveticaNeue-Medium HelveticaNeue-LightItalic HelveticaNeight-Italic HelveticaNeue-UltraLightItalic HelveticaNeue-Bold HelveticaNeue-BoldItalic HelveticaNeue-CondensedBold HelveticaNeue-CondensedBlack

    所以你能想到的第一件事是:我只需要检查名称的后缀(使用 hasSuffix: ) . 但那可能会出错 .
    实际上,有些字体有代工后缀(我找到的是LT,MT和EF) .
    好吧,例如:
    Times New Roman "real name"是TimesNewRomanPSMT .
    它的斜体版本是TimesNewRomanPS-ItalicMT
    这就是为什么我们必须检查它是否有代工厂后缀,因为TimesNewRomanPSMT-Italic赢了't work (since it doesn' t,如果你尝试设置一个带有这个名字的字体,它将是零) .
    所以,据我所知,至于我可能有一些经验和我见过的案例,你可以做什么:检查 [currentFont name] 是否包含: BoldItalicItalicBold ,使用 NSRegularExpressionrangeOfString: . 请注意,我建议之前检查 BoldItalic ,因为 Italic 可能"hides" Bold 就在它之前,并且 Bold 可能"hides" Italic 就在它之后 .
    为了做到这一点,我建议你创建一个像这样(或这种风格)的方法:

    -(UIFont)getCorrespondingHelveticaNeueFontMatchingCharacteriticsOf:(UIFont *)font
    {
        UIFont *helveticaNueue;
        if (!font) //Checking if there is a font)
        {
            helveticaNueue = [UIFont fontWithName@"HelveticaNueue" size:defaultSizeYouSet];
        }
        else
        {
            //Check if it's BoldItalic/Italic/Bold
        }
        return helveticaNueue;
    }
    

    检查我之前提到的所有情况 .
    因此,从前面的代码中,您只需要替换为Calibri特定工作的 if 测试:

    UIFont *newFont = [self getCorrespondingHelveticaNeueFontMatchingCharacteriticsOf:currentFont];
    

    现在你可能想要做的第三部分(并将它们添加到你的测试中):字体的 Black 案例是否想要作为 Bold 进行管理?好吧, Helvetica Neue 有"property",但是您可能想直接使用 black 属性 Helvetica Neue ,并且可能想要检查 currentFont 是否有它(再次,另一种情况) .

    编辑:您可以使用自iOS7以来我们可以使用 UIFontDescriptor . 这是你可以做的:

    -(UIFont *)customFontMatchingFont:(UIFont *)otherFont
    {
        NSString *customFontName = @"Helvetica"; //The custom font
        UIFont *tempFont = [UIFont fontWithName:customFontName size:[otherFont pointSize]]; 
        return [UIFont fontWithDescriptor:[[tempFont fontDescriptor] fontDescriptorWithSymbolicTraits:[[otherFont fontDescriptor] symbolicTraits]] size:[otherFont pointSize]];
    }
    

    注意:我没有检查所有的情况(如果您的自定义系列没有匹配的字体,它返回什么?等等),但如果你不做太复杂的话,这可能是一个不错的插件的东西 .

相关问题