2012-07-02 6 views
3

Y a-t-il un moyen de fournir ce type d'effet dans un UITextView? Si non, alors comment puis-je obtenir cet effet?Affichage d'un bloc de texte avec une lettre initiale surdimensionnée dans un UITextView

enter image description here

+2

Les lettrines sont étranges dans le texte principal, vous devrez rendre une lettre extra large avec un appel CTFrameDraw supplémentaire. – CodaFi

+0

@CodaFi Bonjour, Merci pour votre réponse. Pouvez-vous s'il vous plaît élaborer un peu ou me fournir un tutoriel ou quoi que ce soit pour cela? –

+0

@ josh-caswell: Merci pour votre modification. –

Répondre

1

Avoir la même exigence, je crée une sous-classe UIView qui dessine le texte avec une lettrine. Le texte est dessiné en utilisant le texte de base, et comme @CodaFi a suggéré que la limite de chute est dessinée dans un cadre de texte de base séparé.

La mise en œuvre complète de la classe: https://gist.github.com/4596476

La viande de celui-ci ressemble à quelque chose comme ceci:

- (void)drawRect:(CGRect)rect { 
    // Create attributed strings 
    NSAttributedString *bodyText = [[NSAttributedString alloc] initWithString:[self.text substringWithRange:NSMakeRange(1, self.text.length -1)] attributes:_bodyAttributes]; 
    NSAttributedString *capText = [[NSAttributedString alloc] initWithString:[[self.text substringWithRange:NSMakeRange(0, 1)] uppercaseString] attributes:_capAttributes]; 

    CGRect capFrame = CGRectMake(0, 0, [capText size].width, [capText size].height); 

    // Set up graphics context 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetTextMatrix(context, CGAffineTransformIdentity); 
    CGContextTranslateCTM(context, 0, self.bounds.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 

    // Create type frames 
    CGMutablePathRef bodyPath = CGPathCreateMutable(); 
    CGAffineTransform transform = CGAffineTransformTranslate(CGAffineTransformMakeScale(1, -1), 0, -self.bounds.size.height); 
    CGPathMoveToPoint(bodyPath, &transform, CGRectGetMaxX(capFrame), 0); 
    CGPathAddLineToPoint(bodyPath, &transform, self.bounds.size.width, 0); 
    CGPathAddLineToPoint(bodyPath, &transform, self.bounds.size.width, self.bounds.size.height); 
    CGPathAddLineToPoint(bodyPath, &transform, 0, self.bounds.size.height); 
    CGPathAddLineToPoint(bodyPath, &transform, 0, CGRectGetMaxY(capFrame)); 
    CGPathAddLineToPoint(bodyPath, &transform, CGRectGetMaxX(capFrame), CGRectGetMaxY(capFrame)); 
    CGPathCloseSubpath(bodyPath); 

    CGMutablePathRef capPath = CGPathCreateMutable(); 
    CGPathAddRect(capPath, &transform, CGRectMake(0, 0, capFrame.size.width+10, capFrame.size.height+10)); 

    // Draw text 
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef) bodyText); 
    CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), bodyPath, NULL); 
    CFRelease(framesetter); 
    CTFrameDraw(frame, context); 
    CFRelease(frame); 
    framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)capText); 
    frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), capPath, NULL); 
    CFRelease(framesetter); 
    CTFrameDraw(frame, context); 
    CFRelease(frame); 
} 

L'essentiel de c'est de créer deux chemins, un rectangle contenant la lettrine, et un rectangle avec une encoche enlevée pour le reste du texte. L'implémentation complète sur gist vous permet de contrôler les polices, l'espacement autour de la lettrine et l'encart de contenu de l'ensemble de la vue à l'aide des propriétés.

Il n'implémente pas la plupart des fonctionnalités d'un UITextView (uniquement les fonctionnalités dont j'avais besoin), donc ce n'est peut-être pas une solution complète.

Espérons que ça aide!

+0

Salut, merci pour votre réponse. C'est un grand effort que vous avez fait. Mais j'ai déjà réalisé cette exigence à moi avec HTML :). –

+0

Oui, c'était une vieille question, mais j'espère que ça sera utile à quelqu'un d'autre! J'ai d'abord utilisé html, mais webkit a fini par être beaucoup trop lent pour mon application. –

Questions connexes