web-dev-qa-db-fra.com

Comment obtenir le "rembourrage" d'UIButton/UILabel dans une application iPhone

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.

56
user210437

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.

23
user210437

J'utilise auto layout. La solution qui a fonctionné pour moi a été de régler UIButton's contentEdgeInsets.

ObjC

button.contentEdgeInsets = UIEdgeInsetsMake(0.0f, 30.0f, 0.0f, 30.0f);

Rapide

button.contentEdgeInsets = UIEdgeInsets(top: 0.0, left: 30.0, bottom: 0.0, right: 30.0)
92
RaffAl

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: -

  1. Sélectionnez View controller, sélectionnez uibutton 
  2. Allez dans le panneau Utilitaires (Commande + Option + 0) et sélectionnez Inspecteur d'attributs (Commande + Option + 4).
  3. Maintenant, sélectionnez Content dans Edge et réglez Inset selon vos besoins (Voir capture d'écran)

 enter image description here

12
Giru Bhai

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
6
Brody Robertson

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

2
Jakob Egger

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;
2
cleverbit

Sur Xcode 9, les encarts sont maintenant situés dans l'inspecteur Size au lieu de l'inspecteur des attributs:

 Xcode 9 Size Inspector - Button insets

1
Alex

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;
0
Emilio

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];
0
Lukas Kalinski

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 
0
Alan Taylor