333 votes

Marge du texte de l'étiquette UILabel

Je cherche à définir l'insertion/la marge de gauche d'un fichier UILabel et je ne trouve pas de méthode pour le faire. L'étiquette a un arrière-plan défini, de sorte qu'il ne suffit pas de changer son origine pour que cela fonctionne. L'idéal serait d'insérer le texte de la manière suivante 10px environ sur le côté gauche.

470voto

Tommy Herbert Points 4314

J'ai résolu ce problème en sous-classant UILabel et de remplacer drawTextInRect: comme ça :

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

Swift 3.1 :

override func drawText(in rect: CGRect) {
    let insets = UIEdgeInsets.init(top: 0, left: 5, bottom: 0, right: 5)
    super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
}

Swift 4.2.1 :

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

Comme vous l'avez peut-être compris, il s'agit d'une adaptation de La réponse de tc. . Il présente deux avantages par rapport à celui-ci :

  1. il n'est pas nécessaire de le déclencher en envoyant une sizeToFit message
  2. il laisse le cadre de l'étiquette seul - pratique si votre étiquette a un fond et que vous ne voulez pas qu'il se rétrécisse.

154voto

blyabtroi Points 348

Pour les textes multilignes, les marges gauche et droite peuvent être définies à l'aide de NSAttributedString.

NSMutableParagraphStyle *style =  [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
style.alignment = NSTextAlignmentJustified;
style.firstLineHeadIndent = 10.0f;
style.headIndent = 10.0f;
style.tailIndent = -10.0f;   

NSAttributedString *attrText = [[NSAttributedString alloc] initWithString:title attributes:@{ NSParagraphStyleAttributeName : style}];  

UILabel * label = [[UILabel alloc] initWithFrame:someFrame];
label.numberOfLines = 0;
label.attributedText = attrText;

Voici l'exemple ci-dessus adopté à Swift 5 :

extension UILabel {
    func setMargins(margin: CGFloat = 10) {
        if let textString = self.text {
            var paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.firstLineHeadIndent = margin
            paragraphStyle.headIndent = margin
            paragraphStyle.tailIndent = -margin
            let attributedString = NSMutableAttributedString(string: textString)
            attributedString.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attributedString.length))
            attributedText = attributedString
        }
    }
}

96voto

Brody Robertson Points 3197

La meilleure approche pour ajouter du rembourrage à un UILabel est de sous-classer UILabel et d'ajouter une propriété edgeInsets. Vous définissez ensuite les insets souhaités 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;
}

- (void)drawTextInRect:(CGRect)rect {
    [super drawTextInRect:UIEdgeInsetsInsetRect(rect, self.edgeInsets)];
}

- (CGSize)intrinsicContentSize
{
    CGSize size = [super intrinsicContentSize];
    size.width  += self.edgeInsets.left + self.edgeInsets.right;
    size.height += self.edgeInsets.top + self.edgeInsets.bottom;
    return size;
}

@end

76voto

Peter DeWeese Points 10185

La sous-classification est un peu lourde pour un cas aussi simple. Une alternative consiste à ajouter simplement l'étiquette UILabel sans arrière-plan à une vue UIView dont l'arrière-plan est défini. Définissez le x de l'étiquette à 10 et faites en sorte que la taille de la vue externe soit 20 pixels plus large que l'étiquette.

42voto

yar1vn Points 1472

Edit : C'est vraiment vieux. Il y a de meilleures solutions ci-dessus.

J'ai fini par ajouter quelques espaces au texte :

self.titleLabel.text = [NSString stringWithFormat:@"    %@", self.titleLabel.text];

Moche mais efficace, et ne nécessitant aucune sous-classification.

Vous pouvez essayer " \t " également. Pour une solution générique, veuillez vous référer à la réponse acceptée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X