Plusieurs applications de mon application iPhone nécessitent un remplissage, par exemple un UIButton personnalisé avec un texte aligné à gauche et un UILabel avec une couleur d'arrière-plan.
C'est peut-être une question vraiment stupide, mais comment puis-je appliquer un "remplissage" pour déplacer le texte du bord gauche?
J'en ai marre d'utiliser des limites, etc. sans succès.
Je sais que je pourrais créer une vue wrapper pour ma UILabel
avec une couleur d’arrière-plan, mais cela semble excessif.
Merci beaucoup.
Ok la solution la plus simple que j'ai trouvée jusqu'ici est:
self.textAlignment = UITextAlignmentCenter;
[self sizeToFit];
CGRect frame = self.frame;
frame.size.width += 20; //l + r padding
self.frame = frame;
Pas exactement ce que je voulais, mais ça marche.
J'utilise auto layout. La solution qui a fonctionné pour moi a été de régler UIButton
's contentEdgeInsets
.
button.contentEdgeInsets = UIEdgeInsetsMake(0.0f, 30.0f, 0.0f, 30.0f);
button.contentEdgeInsets = UIEdgeInsets(top: 0.0, left: 30.0, bottom: 0.0, right: 30.0)
Pour définir le remplissage dans le texte uibutton, vous devez utiliser la propriété contentEdgeInsets
de UIButton . Dans Storyboard, pour définir l'insert de contenu, procédez comme suit: -
Pour ajouter du rembourrage à UILabel, l'approche la plus flexible consiste à sous-classer UILabel et à ajouter une propriété edgeInsets. Vous définissez ensuite les incrustations souhaitées et l'étiquette sera dessinée en conséquence.
OSLabel.h
#import <UIKit/UIKit.h>
@interface OSLabel : UILabel
@property (nonatomic, assign) UIEdgeInsets edgeInsets;
@end
OSLabel.m
#import "OSLabel.h"
@implementation OSLabel
- (id)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self) {
self.edgeInsets = UIEdgeInsetsMake(0, 0, 0, 0);
}
return self;
}
-(id)initWithCoder:(NSCoder *)aDecoder{
self = [super initWithCoder:aDecoder];
if(self){
self.edgeInsets = UIEdgeInsetsMake(0, 0, 0, 0);
}
return self;
}
- (void)drawTextInRect:(CGRect)rect {
return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, self.edgeInsets)];
}
@end
Voici une sous-classe d'UILabel dotée d'un remplissage personnalisable à l'aide d'une propriété edgeInset:
PaddedLabel.h
#import <UIKit/UIKit.h>
@interface PaddedLabel : UILabel
@property UIEdgeInsets edgeInsets;
@end
PaddedLabel.m
#import "PaddedLabel.h"
@implementation PaddedLabel
-(void)drawTextInRect:(CGRect)rect {
return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, self.edgeInsets)];
}
-(CGSize)intrinsicContentSize {
CGSize contentSize = [super intrinsicContentSize];
UIEdgeInsets insets = self.edgeInsets;
contentSize.height += insets.top + insets.bottom;
contentSize.width += insets.left + insets.right;
return contentSize;
}
@end
(Ceci est une simplification de la réponse de Brody qui fonctionne également avec l'autolayout.)
CGRectInset est votre ami. Vous pouvez définir des "incrustations" négatives pour créer un remplissage:
[self sizeToFit];
CGRect rect = self.frame;
rect = CGRectInset( rect, -6.f, -5.f); // h inset, v inset
self.frame = rect;
Pourquoi ne pas créer une classe personnalisée qui étend UIButton et redéfinir ceci:
- (CGRect)titleRectForContentRect:(CGRect)contentRect
{
return UIEdgeInsetsInsetRect(contentRect, UIEdgeInsetsMake(topPadding, rightPadding, bottomPadding, leftPadding));
}
Dans le cas de UILabel, remplacez simplement:
- (CGRect)textRectForBounds:(CGRect)bounds
limitedToNumberOfLines:(NSInteger)numberOfLines;
Si vous cherchez juste un rembourrage horizontal sur une ligne, cela peut suffire (c'est pour moi):
NSString* padding = @" "; // 2 spaces
myLabel.text = [NSString stringWithFormat:@"%@%@%@", padding, name, padding];
J'essaie de faire quelque chose de similaire, c'est-à-dire "pad" a UILabel
. J'ai essayé d'appliquer la solution indiquée par Toby ci-dessus, mais je n'arrive pas à trouver où cela doit aller ... Le UILabel avec lequel je travaille est aligné à gauche - est-ce ce qui cause le problème?
J'ai essayé d'utiliser ceci dans viewDidLoad
, et même dans une sous-classe de UILabel dans la méthode:
- (CGRect)textRectForBounds:(CGRect)bounds
limitedToNumberOfLines:(NSInteger)numberOfLines