2014-07-17 5 views
1

J'utilise la famille police personnalisée « aller Typo » dans notre application avec une fonction de soutien édition de texte multilingue (UITextView) et l'utilisation -fallback police sur le texte appliqué avec les attributs de police personnalisée sur NSAttributedString

« AllerTypo-Light » pour texte brut (sans caractères)

"AllerTypo-Regular" pour gras.

"AllerTypo-LightItalic" pour l'italique.

"AllerTypo-Italic" pour gras italique.

Le problème est quand je demande la police sur les textes (glyphes) non pris en charge dans cette famille de polices, il fallback vraisemblablement à une police (par exemple « Helvetica » famille pour le texte russe) réappliquer les traits du visage de police du client, mais ignorant le fait que j'utilise la version "AllerTypo-Regular" pour gras -ness. S'il vous plaît, aidez-moi à résoudre cela.

Veuillez voir ci-dessous extrait de code pour ce dont j'ai parlé ci-dessus.

// Apply current theme on default attributes (like font, text color) 
NSMutableAttributedString *updatedAttribText = [attribText mutableCopy]; 

[updatedAttribText beginEditing]; 
[attribText enumerateAttributesInRange:NSMakeRange(0, attribText.length) 
           options:0 
          usingBlock:^(NSDictionary *attrs, NSRange range, BOOL *stop) { 

           // Check for font attributes 
           UIFont *textRunfont = [attrs objectForKey:NSFontAttributeName]; 
           NSMutableDictionary *updatedAttribs = [attrs mutableCopy]; 

           [updatedAttribs updateAttributesWithTextStyle:textRunfont.fontDescriptor.symbolicTraits action:YES fontFamily:@"Aller Typo"]; 

           // Check for default text color now 
           UIColor *textRunColor = [attrs objectForKey:NSForegroundColorAttributeName]; 

           if ([textRunColor isEqual:[UIColor colorWithRed:0 green:0 blue:0 alpha:1.0]]) { 
            UIColor *defaultTextColor = [[QGThemeHelper currentTheme] uiTextViewTextColor]; 

            [updatedAttribs setValue:defaultTextColor forKey:NSForegroundColorAttributeName]; 
           } 

           [updatedAttribText setAttributes:updatedAttribs range:range]; 
          }]; 

[updatedAttribText endEditing]; 

Méthode de catégorie NSMutableDictionary, utilisée ci-dessus, pour mettre à jour les attributs de texte.

- (void)updateAttributesWithTextStyle:(UIFontDescriptorSymbolicTraits)updateStyleTraits action:(BOOL)addAction fontFamily:(NSString *)familyName 
{ 
    UIFont *currentFont = [self objectForKey:NSFontAttributeName]; 
    UIFontDescriptorSymbolicTraits updatedTraits = 0; 

    // Fetch existing traits and then apply the text style 
    if (!addAction) { // Remove 
     updatedTraits = ([currentFont qg_textStyleTraits] & ~updateStyleTraits); 
    } 
    else { // Apply 
     updatedTraits = ([currentFont qg_textStyleTraits] | updateStyleTraits); 
    } 

    // Appropriate font from the family with mentioned traits (bold, italic, bold italic). 
    NSString *updatedFontName = [UIFont qg_fontNameFromFamily:familyName withTextStyleTraits:updatedTraits]; 
    UIFont *updatedFont = [UIFont fontWithName:updatedFontName size:currentFont.pointSize]; 

    [self setObject:updatedFont forKey:NSFontAttributeName]; 
} 

En d'autres termes, est-il un moyen que je peux communiquer à fallback système sur mes intentions (personnalisation de la police)? La fonctionnalité italique fonctionne bien car la police "AllerTypo-Italic" porte ce trait et le système le réapplique pendant le repli.

Remarque supplémentaire - La source de contenu textuel (texte attribué) est une balise HTML codée stockée dans CoreData qui est également synchronisée avec notre application Web.

Répondre

2

Avez-vous essayé UIFontDescriptorCascadeListAttribute.

Pour ce faire, vous devrez peut-être créer UIFont avec -[UIFont fontWithDescriptor:size:], et pour le descripteur, vous devez définir l'attribut UIFontDescriptorCascadeListAttribute avec les polices auxquelles vous souhaitez revenir.

Questions connexes