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.
Réponses
Trop de publicités?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 :
- il n'est pas nécessaire de le déclencher en envoyant une
sizeToFit
message - 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.
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
}
}
}
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
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.
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.