J'ai une sous-class de UIView qui implémente le code pour dessiner CoreText. Dans l'application, ce UIView est dessiné dans un UIScrollView. Voici le code que j'utilise actuellement dans drawRect: pour rendre un NSAtsortingbutedSsortingng:
CGContextRef context = UIGraphicsGetCurrentContext(); float viewHeight = self.bounds.size.height; CGContextTranslateCTM(context, 0, viewHeight); CGContextScaleCTM(context, 1.0, -1.0); CGContextSetTextMasortingx(context, CGAffineTransformMakeScale(1.0, 1.0)); CGMutablePathRef path = CGPathCreateMutable(); CGRect bounds = CGRectMake(PADDING_LEFT, -PADDING_TOP, self.bounds.size.width-20.0, self.bounds.size.height); CGPathAddRect(path, NULL, bounds); CTFramesetterRef framesetter = CTFramesetterCreateWithAtsortingbutedSsortingng((CFMutableAtsortingbutedSsortingngRef)attrSsortingng); CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL); CFRelease(framesetter); CFRelease(path); CTFrameDraw(frame, context);
Dans mon NSAtsortingbutedSsortingng, j'ai certains attributes de text pour colorier le text.
Ce dont j'ai besoin d'aide est conceptuellement, comment cela devrait-il être accompli? Je suis confus par toutes les différentes methods de dessin des frameworks, couches, etc. J'ai essayé de passer en revue plusieurs livres et d'autres ressources, mais j'ai l'printing qu'il me manque des choses de base.
Voici mes exigences:
J'apprécierais grandement toute aide.
Voici ce que j'ai essayé jusqu'ici:
J'ai ajouté un nouveau UIView comme une sous-vue à l'UIScrollView pour contenir les faits saillants. J'ajoute ensuite des UIViews individuels pour les points forts eux-mêmes. Lorsque je crée des surlignages "test" factices, ils apparaissent correctement dans la vue CoreText. Je peux aussi facilement changer la couleur de surbrillance. Cependant, quand je vais acquérir des informations réelles sur les lignes de la vue CoreText pour créer des faits saillants réels, il renvoie zéro lignes. Serait-ce parce que drawRect n'a pas encore fini de dessiner ou quelque chose d'autre?
Voici quelques questions:
J'ai vu ce projet open source:
https://github.com/Cocoanetics/NSAtsortingbutedSsortingng-Additions-for-HTML
C'est incroyable ce qu'il peut faire, mais c'est beaucoup plus complexe et détaillé que ce dont j'ai besoin. Le code rend chaque exécution de glyphe individuelle en utilisant CoreText et permet la mise en évidence, ce qui est génial. Cependant, j'essaie de garder mon code simple et léger. Je connais très peu de choses sur CoreGraphics, CoreAnimation ou CoreText.
J'ai également vu cette question:
Core Text – Obtenir les coordonnées pixel de NSRange
La réponse à la question fournit les appels pour déterminer les limites d'un Rect pour une gamme donnée dans une ligne donnée. Je pense que je peux comprendre ces appels.
METTRE À JOUR
Voici ce que j'ai fait maintenant. Je suis sûr que c'est faux, mais c'est le seul moyen que j'ai trouvé pour le faire fonctionner …
Cela n'appelle pas drawRect chaque fois qu'une surbrillance est ajoutée au conteneur ou que la couleur est modifiée. Cependant, je sais que ce n'est pas une solution idéale. Des problèmes avec cette solution:
Votre idée de base n'est pas trop mauvaise pour la mise en évidence. Je ne sais pas si c'est vraiment plus facile que de simplement mettre en évidence les glyphes pendant que vous dessinez, mais ce n'est pas une mauvaise idée, et cela facilite l'activation et la désactivation de la mise en surbrillance, alors c'est plutôt sympa.
Plutôt que de créer beaucoup de vues, placez votre text de base sur un CALayer
place. Vous pouvez ensuite créer des couches de mise en évidence supplémentaires pour mettre le text en surbrillance. Cela garde tout à l'intérieur d'une seule vue. Les calques sont beaucoup less chers que les vues. Si vous essayez simplement de mettre en surbrillance le style "surligneur", vous pouvez simplement définir le backgroundColor
et le frame
pour les calques et vous avez terminé.