web-dev-qa-db-fra.com

Comment utiliser drawInRect: withAttributes: au lieu de drawAtPoint: forWidth: withFont: fontSize: lineBreakMode: baselineAdjustment: dans iOS 7

Cette méthode est déconseillée dans iOS 7.0:

drawAtPoint:forWidth:withFont:fontSize:lineBreakMode:baselineAdjustment:

Utilisez maintenant drawInRect:withAttributes: au lieu.

Je ne trouve pas l'attributName de fontSize et baselineAdjustment.

Modifier

Merci @Puneet réponse.

En fait, je veux dire s'il n'y a pas ces clés, comment implémenter cette méthode dans iOS 7?

Comme la méthode ci-dessous:

+ (CGSize)drawWithString:(NSString *)string atPoint:(CGPoint)point forWidth:(CGFloat)width withFont:(UIFont *)font fontSize:(CGFloat)fontSize
           lineBreakMode:(IBLLineBreakMode)lineBreakMode
      baselineAdjustment:(UIBaselineAdjustment)baselineAdjustment {
    if (iOS7) {
        CGRect rect = CGRectMake(point.x, point.y, width, CGFLOAT_MAX);

        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
        paragraphStyle.lineBreakMode = lineBreakMode;

        NSDictionary *attributes = @{NSFontAttributeName: font, NSParagraphStyleAttributeName: paragraphStyle};

        [string drawInRect:rect withAttributes:attributes];

        size = CGSizeZero;
    }
    else {
        size = [string drawAtPoint:point forWidth:width withFont:font fontSize:fontSize lineBreakMode:lineBreakMode baselineAdjustment:baselineAdjustment];
    }
    return size;
}

Je ne sais pas comment passer fontSize et baselineAdjustment à

attributes dictionnaire.

par exemple.

NSBaselineOffsetAttributeName doit lui passer un NSNumer, mais le baselineAdjustment est Enum.

N'y a-t-il pas d'autre moyen de passer les deux variables?

40
Vincent

Vous pouvez utiliser NSDictionary et appliquer des attributs comme celui-ci:

NSFont *font = [NSFont fontWithName:@"Palatino-Roman" size:14.0];

NSDictionary *attrsDictionary =

[NSDictionary dictionaryWithObjectsAndKeys:
                              font, NSFontAttributeName,
                              [NSNumber numberWithFloat:1.0], NSBaselineOffsetAttributeName, nil];

Utilisez attrsDictionary comme argument.

Voir: Guide de programmation des chaînes attribuées

Voir: Attributs standard

Swift: IN String drawInRect n'est pas disponible mais nous pouvons utiliser NSString à la place:

let font = UIFont(name: "Palatino-Roman", size: 14.0)
let baselineAdjust = 1.0
let attrsDictionary =  [NSFontAttributeName:font, NSBaselineOffsetAttributeName:baselineAdjust] as [NSObject : AnyObject]
let str:NSString = "Hello World"
str.drawInRect(CGRectZero, withAttributes: attrsDictionary)
38
Puneet Sharma

C'est un peu plus compliqué qu'auparavant et vous ne pouvez pas utiliser une taille de police minimale, mais vous devez utiliser un facteur d'échelle de police minimum. Il existe également un bogue dans le SDK iOS, qui le casse pour la plupart des cas d'utilisation (voir les notes en bas). Voici ce que vous devez faire:

// Create text attributes
NSDictionary *textAttributes = @{NSFontAttributeName: [UIFont systemFontOfSize:18.0]};

// Create string drawing context
NSStringDrawingContext *drawingContext = [[NSStringDrawingContext alloc] init];
drawingContext.minimumScaleFactor = 0.5; // Half the font size

CGRect drawRect = CGRectMake(0.0, 0.0, 200.0, 100.0);
[string drawWithRect:drawRect
             options:NSStringDrawingUsesLineFragmentOrigin
          attributes:textAttributes
             context:drawingContext];

Notes:

  • Il semble y avoir un bogue dans le SDK iOS 7 au moins jusqu'à la version 7.0.3: si vous spécifiez une police personnalisée dans les attributs, le miniumScaleFactor est ignoré. Si vous passez zéro pour les attributs, le texte est mis à l'échelle correctement.

  • L'option NSStringDrawingUsesLineFragmentOrigin est importante. Il indique au système de dessin de texte que l'origine du rectangle de dessin doit être dans le coin supérieur gauche.

  • Il n'y a aucun moyen de définir l'ajustement de référence à l'aide de la nouvelle méthode. Vous devez le faire vous-même en appelant boundingRectWithSize:options:attributes:context: d'abord, puis ajustez le rect avant de le passer à drawWithRect:options:attributes:context.

34
Florian