从用户input的属性string中查找属性

在我的应用程序中,用户将键入任何他想要的,他可以使文本粗体,斜体和下划线。

我可以做文本 – 粗体,斜体和下划线。

我需要用户input的属性string中find哪些文本(或字符)粗体,斜体和下划线

任何types的链接,教程,代码将是很大的帮助。

编辑:

我需要这样的结果…

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

我需要将Calibri字体族中的所有文本转换为HelveticaNeue字体族,而不更改其属性。

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

[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]; }]; 

从你的评论中,你可能会看到更复杂的东西,所以我会给你一些想法/提示做/检查。 你只需要完成我以前的代码来pipe理所有的情况。
案例:没有字体。
你只需要检查currentFont是否为零。 如果是的话,你设定你想要的。 由于没有斜体/粗体的属性(因为它们被“包含”在字体中),所以我build议你设置为newFont :HelveticaNeue。
•案例:与Calibri相比是另一种字体。 那里比较复杂。
我已经使用过了,在这里我得到了:字体名称(这是postscript name )是这样的HelveticaNeue(给出的例子):

HelveticaNeue
HelveticaNeue-灯
HelveticaNeue-超轻
HelveticaNeue介质
HelveticaNeue-LightItalic
HelveticaNeue斜体
HelveticaNeue-UltraLightItalic
HelveticaNeue粗体
HelveticaNeue-BOLDITALIC
HelveticaNeue-CondensedBold
HelveticaNeue-CondensedBlack

所以你可以想到的第一件事:我只需要检查名称的后缀(用hasSuffix: 。 但是这可能会出错。
事实上,一些字体有铸造后缀(我发现的是LTMTEF )。
那么,例如:
Times New Roman “真实姓名”是TimesNewRomanPSMT
它的斜体版本是TimesNewRomanPS-ItalicMT
这就是为什么我们必须检查它是否有铸造后缀,因为TimesNewRomanPSMT-Italic将不起作用(因为它不存在,如果你尝试设置一个字体的名字,这将是 )。
所以,据我所知,到目前为止,我可能有一些经验和我见过的情况,你可以做什么:检查是否[currentFont name]包含: BoldItalicItalicBold ,使用NSRegularExpressionrangeOfString: 请注意,我build议以前检查BoldItalic因为Italic可能会在其之前“隐藏”一个Bold ,而Bold可能会在它之后“隐藏”一个Italic
为了做到这一点,我build议你创build一个像这样(或这种风格)的方法:

 -(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; } 

检查我之前提到的所有情况。
所以,从以前的代码中,你只需要replace为Calibri特别工作的iftesting:

 UIFont *newFont = [self getCorrespondingHelveticaNeueFontMatchingCharacteriticsOf:currentFont]; 

现在你可能想要做的第三部分(并将它们添加到你的testing中):字体的Black情况是否希望被pipe理为Bold ? 那么, Helvetica Neue有这个“属性”,但是你可能想直接使用Helvetica Neueblack属性,并且可能想要检查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]]; } 

注意:我没有检查所有的情况(如果你的自定义系列没有匹配的字体,它会返回什么等),但是如果你不太复杂的话,这可能是一个很好的附加组件的东西。