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?
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)
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
.