web-dev-qa-db-fra.com

iOS Ajouter un rembourrage gauche à UILabel

Je dois créer une UILabel avec une couleur de fond, et j'aimerais ajouter un peu de remplissage à gauche, mais chaque solution que j'ai trouvée ici ressemble à un mauvais bidouillage. 

Quel est le moyen "standard" d'y parvenir à partir d'iOS 5?

MODIFIER

Une capture d'écran pour illustrer mon scénario.-

enter image description here

64
ssantos

Pour une liste complète des solutions disponibles, voir la réponse ci-dessous: Marge de texte UILabel


Essayez de sous-classer UILabel, comme @Tommy Herbert le suggère dans la réponse à [cette question] [1]. Copié et collé pour votre commodité:

J'ai résolu ce problème en sous-classant UILabel et en redéfinissant drawTextInRect: comme ceci:

- (void)drawTextInRect:(CGRect)rect {
    UIEdgeInsets insets = {0, 5, 0, 5};
    [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
}
94
siege_Perilous

ajoutez également un caractère d'espacement à la chaîne. c'est le rembourrage du pauvre homme :)

OR

J'irais avec une vue d'arrière-plan personnalisée, mais si vous ne le souhaitez pas, l'espace est la seule autre option facile que je vois ... 

OU écrivez une étiquette personnalisée. rendre le texte via coretext

24
Daij-Djan

Je sais que c'est vieux, mais pour la postérité .. 

La partie la plus importante est que vous devez remplacer intrinsicContentSize () et drawTextInRect () afin de prendre en compte AutoLayout

var contentInset: UIEdgeInsets = .zero {
    didSet {
        setNeedsDisplay()
    }
}

override public var intrinsicContentSize: CGSize {
    let size = super.intrinsicContentSize
    return CGSize(width: size.width + contentInset.left + contentInset.right, height: size.height + contentInset.top + contentInset.bottom)
}

override public func drawText(in rect: CGRect) {
    super.drawText(in: UIEdgeInsetsInsetRect(rect, contentInset))
}
23
Mike
#define PADDING 5

@interface MyLabel : UILabel

@end

@implementation MyLabel

- (void)drawTextInRect:(CGRect)rect {
    return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, UIEdgeInsetsMake(0, PADDING, 0, PADDING))];
}

- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines
{
    return CGRectInset([self.attributedText boundingRectWithSize:CGSizeMake(999, 999)
                                                         options:NSStringDrawingUsesLineFragmentOrigin
                                                         context:nil], -PADDING, 0);
}

@end
23
rudensm
UIView* bg = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.frame.size.width, 70)];
bg.backgroundColor = [UIColor blackColor];
UILabel* yourLabel = [[UILabel alloc]initWithFrame:CGRectMake(10, y, yourWidth, yourHeight)];
[bg addSubview:yourLabel];

[self addSubview:bg];
16
incmiko

Il est parfois pratique d’utiliser des espaces partiels UNICODE pour réaliser l’alignement lors du prototypage. Cela peut être pratique pour le prototypage, la validation de principe ou simplement pour différer la mise en œuvre des algorithmes graphiques. 

Si vous utilisez des espaces UNICODE pour plus de commodité, sachez qu'au moins un des espaces UNICODE a une taille basée sur la police à partir de laquelle il est affiché, en particulier le caractère d'espace lui-même (U + 0020, ASCII 32).

Si vous utilisez la police système iOS par défaut dans un UILabel, les caractéristiques de la police système par défaut pourraient changer dans une version ultérieure d'iOS et introduire soudainement un défaut d'alignement non souhaité en modifiant l'espacement précis de votre application. Cela peut arriver et cela arrive, par exemple, la police "San Francisco" a remplacé une police système iOS antérieure dans une version iOS.

UNICODE facile à spécifier dans Swift, par exemple:

let six_per_em_space = "\u{2006}"

Vous pouvez également couper/coller l'espace d'une page HTML directement dans le champ de texte du libellé UILabel dans Interface Builder. 

Note: La photo jointe est une capture d'écran, not HTML, visitez donc la page liée si vous voulez couper/coller l'espace.

UNICODE spaces

15
clearlight

J'ai eu quelques problèmes avec les réponses ici, par exemple lorsque vous avez ajouté le remplissage, la largeur du contenu débordait de la boîte et que je voulais un rayon de coin. J'ai résolu cela en utilisant la sous-classe suivante d'UILabel:

#import "MyLabel.h"

#define PADDING 8.0
#define CORNER_RADIUS 4.0

@implementation MyLabel

- (void)drawRect:(CGRect)rect {
 self.layer.masksToBounds = YES;
 self.layer.cornerRadius = CORNER_RADIUS;
 UIEdgeInsets insets = {0, PADDING, 0, PADDING};
 return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
}
- (CGSize) intrinsicContentSize {
 CGSize intrinsicSuperViewContentSize = [super intrinsicContentSize] ;
 intrinsicSuperViewContentSize.width += PADDING * 2 ;
 return intrinsicSuperViewContentSize ;
}

@end

J'espère que ça aide à quelqu'un! Notez que si vous vouliez un remplissage en haut et en bas, vous devrez changer ces lignes:

UIEdgeInsets insets = {0, PADDING, 0, PADDING};

Pour ça:

UIEdgeInsets insets = {PADDING, PADDING, PADDING, PADDING};

Et ajoutez cette ligne sous celle-ci pour la largeur:

intrinsicSuperViewContentSize.height += PADDING * 2 ;
4
Ben

Une chose que j'ai faite pour surmonter ce problème a été d'utiliser un UIButton au lieu d'un UILabel. Ensuite, dans l'inspecteur d'attributs du générateur d'interface, j'ai utilisé le bord pour le titre comme remplissage.
Si vous n'attachez pas le bouton à une action, une fois cliqué dessus, il ne sera pas sélectionné mais il restera affiché en surbrillance. 

Vous pouvez également le faire par programme avec le code suivant: 

UIButton *mButton = [[UIButton alloc] init];
[mButton setTitleEdgeInsets:UIEdgeInsetsMake(top, left, bottom, right)];
[mButton setTitle:@"Title" forState:UIControlStateNormal];
[self.view addSubView:mButton];

Cette approche donne le même résultat, mais parfois, elle n’a pas fonctionné pour une raison que je n’ai pas étudiée car, si possible, j’utilise Interface Builder.

C'est toujours une solution de contournement, mais cela fonctionne assez bien si le point culminant ne vous dérange pas. J'espère que c'est utile

2
Francesco D.M.

Swift 5

Créez un fichier de classe ci-dessous et définissez-le sur votre étiquette en tant que nom de classe personnalisé via le storyboard. C'est tout.

class PaddingLabel: UILabel {

    override func drawText(in rect: CGRect) {
        let insets = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 0)//CGRect.inset(by:)
        super.drawText(in: rect.inset(by: insets))
    }
}
1
Ganesh Pawar

en sous-classant UILabel et en remplaçant drawTextInRect: comme ceci:

 - (void)drawTextInRect:(CGRect)rect 
  {
      UIEdgeInsets insets = {0, 10, 0, 0};
      return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
  }
1
Rocker

Si vous voulez ajouter un padding à UILabel sans vouloir le sous-classer, vous pouvez placer votre étiquette dans un UIView et donner des paddings avec autolayout comme:

 Padding with UIView and autolayout

Résultat:

 Result

0
Olcay Ertaş