web-dev-qa-db-fra.com

drawInRect: withAttributes vs drawInRect: withFont: lineBreakMode: alignement

Je travaille sur une nouvelle version de mon application et j'essaie de remplacer les messages obsolètes, mais je ne parviens pas à dépasser celui-ci.

Je n'arrive pas à comprendre pourquoi drawInRect:withAttributes ne fonctionne pas. Le code s'affiche correctement lorsque drawInRect:withFont:lineBreakMode:alignment un message est envoyé, mais ne fonctionne pas lorsque drawInRect:withAttributes est envoyé.

J'utilise le même rect et la même police et je pense que c'est le même style de texte. Les constantes positionnent simplement le rect juste en dessous d'une image, mais j'utilise le même rect pour les deux appels, donc je suis certain que le rectangle est correct.

(notez que bs.name utilisé ci-dessous est un objet NSString)

        CGRect textRect = CGRectMake(fCol*kRVCiPadAlbumColumnWidth,
                                     kRVCiPadAlbumColumnWidth-kRVCiPadTextLabelYOffset,
                                     kRVCiPadAlbumColumnWidth,
                                     kRVCiPadTextLabelHeight);
        NSMutableParagraphStyle *textStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];
        textStyle.lineBreakMode = NSLineBreakByWordWrapping;
        textStyle.alignment = NSTextAlignmentCenter;
        UIFont *textFont = [UIFont systemFontOfSize:16];

Cela ne fonctionne pas (rien n'est dessiné à l'écran) en utilisant les variables d'en haut

        [bs.name drawInRect:textRect
             withAttributes:@{NSFontAttributeName:textFont,
                              NSParagraphStyleAttributeName:textStyle}];

Cela fonctionne (la chaîne est dessinée correctement à l'écran) en utilisant les mêmes variables que ci-dessus

        [bs.name drawInRect:textRect
                   withFont:textFont
              lineBreakMode:NSLineBreakByWordWrapping
                  alignment:NSTextAlignmentCenter];

Toute aide serait formidable. Merci.

30
Ross Pirtle

Pour définir la couleur du texte, vous devez passer le NSForegroundColorAttributeName dans l'attribut comme paramètre supplémentaire.

NSDictionary *dictionary = @{ NSFontAttributeName: self.font,
                              NSParagraphStyleAttributeName: paragraphStyle,
                              NSForegroundColorAttributeName: self.textColor};
36
Hiren

J'ai fait un UIView avec drawRect: contenant uniquement le code que vous avez fourni

- (void)drawRect:(CGRect)frame
{
    NSMutableParagraphStyle *textStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];
    textStyle.lineBreakMode = NSLineBreakByWordWrapping;
    textStyle.alignment = NSTextAlignmentCenter;
    UIFont *textFont = [UIFont systemFontOfSize:16];

    NSString *text = @"Lorem ipsum";

    // iOS 7 way
    [text drawInRect:frame withAttributes:@{NSFontAttributeName:textFont, NSParagraphStyleAttributeName:textStyle}];

    // pre iOS 7 way
    CGFloat margin = 16;
    CGRect bottomFrame = CGRectMake(0, margin, frame.size.width, frame.size.height - margin);
    [text drawInRect:bottomFrame withFont:textFont lineBreakMode:NSLineBreakByWordWrapping alignment:NSTextAlignmentCenter];
}

Je ne vois aucune différence entre les sorties de ces deux méthodes. Peut-être que le problème est ailleurs dans votre code?

29
Arek Holko