2017-02-22 5 views
0

J'affiche la colonne de chaîne NSAttributed en utilisant Core Text. Cela fonctionne bien. Lorsque vous utilisez une police système, elle s'affiche sans délai dans le simulateur et le périphérique. Mais lorsque vous utilisez une police personnalisée, plus de temps est nécessaire pour afficher le contenu dans l'appareil. Mais dans le simulateur, le résultat est rapide.Plus de temps est nécessaire pour afficher la chaîne NSAttributed avec des polices personnalisées

- (void)updateAttributedString 
{ 
     // Existing Code 
    if (self.text != nil) 
    { 

     self.attributedString = [[NSMutableAttributedString alloc] initWithString:self.text]; 
     NSRange range = NSMakeRange(0, [self.text length]); 
     // Regarding Fixed font 
//  [ self.attributedString addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"TAUN_Elango_Abirami" size:20] range:range];//This is my custom font 


      // Regarding custom Font using below code 
     if (self.font != nil) { 
      CTFontRef font = [self createCTFont]; 
      [self.attributedString addAttribute:(NSString *)kCTFontAttributeName 
              value:(__bridge id)font 
              range:range]; 
      CFRelease(font); 
     } 
     } 
} 



- (CTFontRef)createCTFont; 
{ 

    CTFontRef font = CTFontCreateWithName((CFStringRef)self.fontName, self.pointSize, NULL); 

    return font; 
} 

Si j'ajoute la ligne de code suivante,

[self.attributedString addAttribute:(NSString *)kCTFontAttributeName 
               value:(__bridge id)font 
               range:range]; 

afficher la chaîne attribuée est lent dans le dispositif. Mais, dans le simulateur c'est rapide. Si je n'ajoute pas ce morceau de code, le texte s'affiche rapidement dans le simulateur et l'appareil. Créez votre objet de police une fois et maintenez-le dans votre main.

+0

Quelle est votre question? –

+0

@AlbertRenshaw Je dois utiliser une police personnalisée et je veux que le texte soit affiché sans délai dans l'appareil. La lenteur est le problème. – Sharon

+0

Si vous utilisez le profilage temporel des instruments XCode, indique-t-il une ligne spécifique? De plus, avez-vous besoin d'utiliser CoreText, CFStuff et bridge? – Larme

Répondre

0

Je les mettrais probablement en cache dans un dictionnaire statique si vous en aviez plusieurs et que vous deviez partager des objets. Ne créez pas un nouveau chaque fois que vous mettez à jour la chaîne. L'objet de police fait presque certainement tout son travail de décodage compliqué au point où il est d'abord nécessaire (pas le point que vous le créez). Les polices système sont toujours chargées et décodées, mais les polices personnalisées ne sont probablement pas conservées si rien ne les référence. Vous pouvez également expérimenter avec UIFont au lieu de CTFont ici. UIFont est un objet de plus haut niveau, et d'après mon expérience, il cache davantage. Je n'ai pas exploré cette situation particulière. En général, vous devriez généralement utiliser les types UIKit à moins que vous ayez réellement besoin de Core Text. Cela peut être contre-intuitif, car "le niveau inférieur n'est pas plus rapide?" Eh bien, le niveau inférieur peut être plus rapide, si vous savez exactement ce que vous faites. Mais le niveau vraiment inférieur signifie simplement "vous devez prendre soin de plus de choses vous-même." Faire confiance à UIKit est généralement la meilleure solution de premier ordre jusqu'à ce que vous sachiez que vous avez besoin de quelque chose de plus fin.

Il n'est pas surprenant que le simulateur soit plus rapide. Cela fonctionne sur un Mac qui a considérablement plus de puissance de traitement et un disque beaucoup plus rapide qu'un iPhone. Lorsque vous exécutez des tâches sur le simulateur, ce ne sont en fait que des applications Mac fonctionnant dans une interface utilisateur spéciale. ce n'est pas un émulateur complet comme Android utilise.