Encontrar atributos de la cadena atribuida que el usuario tipeó

En mi aplicación, el Usuario tecleará todo lo que quiera y puede hacer que el texto sea Negrita, Cursiva y Subrayado.

Puedo hacer el texto : negrita, cursiva y subrayado.

Pero necesito encontrar qué texto (o carácter) es Negrita, Cursiva y Subrayado de la cadena de atributos que el usuario escribió .

Cualquier tipo de enlace, tutorial, código será de gran ayuda.

EDITAR:

Necesito el resultado así …

si el carácter 6 es en cursiva, imprima en cursiva.
si el carácter 14 es Negrita, imprima en negrita.

Necesito convertir todo el texto de la familia de fonts Calibri a la familia de fonts HelveticaNeue sin cambiar su atributo.

Puede enumerar los Atributos con este código (rango completo).

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

Para un rango específico, debe cambiar el código NSMakeRange(0, [attrStr lenght]) por el rango que necesita.

Después de su edición, su necesidad específica, este código debería hacer el trabajo:

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

Según sus comentarios, es posible que vea cosas más complicadas, así que le daré algunas ideas / consejos para hacer / verificar. Simplemente tendrá que completar mi código anterior para administrar todos los casos.
• Caso: no hay fuente.
Solo tienes que comprobar si currentFont es nulo. Si es así, establezca lo que desea. Como no hay ningún atributo para cursiva / negrita (ya que están “incluidos” en la fuente), le sugiero que configure para newFont : HelveticaNeue.
• Caso: es otra fuente que Calibri. Ahí es bastante más complicado.
He trabajado con eso, y aquí lo que obtuve: el nombre de la fuente (que es el postscript name la postscript name ) se hace así para HelveticaNeue (como ejemplo dado):

HelveticaNeue
HelveticaNeue-Light
HelveticaNeue-UltraLight
HelveticaNeue-Medium
HelveticaNeue-LuzItalic
HelveticaNeue-Cursiva
HelveticaNeue-UltraLightItalic
HelveticaNeue-Bold
HelveticaNeue-BoldItalic
HelveticaNeue-CondensedBold
HelveticaNeue-CondensedBlack

Entonces, lo primero que se te hasSuffix: que solo tengo que verificar el sufijo del nombre (con hasSuffix: . Pero eso puede salir mal.
De hecho, algunas fonts tienen un sufijo de fundición (las que encontré son LT , MT y EF ).
Bueno, por ejemplo:
Times New Roman “nombre real” es TimesNewRomanPSMT .
Y su versión en cursiva es TimesNewRomanPS-ItalicMT
Es por eso que debemos verificar si tiene un sufijo de fundición porque TimesNewRomanPSMT-Italic no funcionará (dado que no existe, si intentas establecer una fuente con este nombre, será nula ).
Por lo tanto, hasta donde yo sé, y en la medida en que pueda tener alguna experiencia y el caso que he visto, lo que podría hacer es verificar si el [currentFont name] contiene: BoldItalic , Italic o Bold , usando un NSRegularExpression o un rangeOfString: Tenga en cuenta que sugeriría comprobar antes para BoldItalic ya que una Italic puede “esconder” un Bold justo antes, y Bold puede “esconder” una Italic justo después de ella.
Para hacerlo, te sugiero que crees un método como este (o de este estilo):

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

revisando todo el caso que mencioné antes.
Entonces, desde el código anterior, solo tendrá que reemplazar las pruebas if que estaban trabajando específicamente para Calibri con:

 UIFont *newFont = [self getCorrespondingHelveticaNeueFontMatchingCharacteriticsOf:currentFont]; 

Ahora es posible que desee hacer una tercera parte (y agréguelos a su prueba): ¿ Black caja Black de una fuente desea administrarse como Bold ? Bueno, Helvetica Neue tiene esta “propiedad”, pero es posible que desee utilizar directamente la propiedad en black para Helvetica Neue , y es posible que desee verificar si currentFont tiene (y de nuevo, otro caso).

EDITAR: Puede usar desde iOS7 podemos usar UIFontDescriptor . Esto es lo que puedes hacer:

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

Nota: No revisé todos los casos (¿qué pasa si su familia personalizada no tiene una fuente que coincida, qué devuelve? Etc.), pero podría ser un complemento agradable si no lo hace demasiado complicado. cosas.