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.-
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)];
}
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
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))
}
#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
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];
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.
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 ;
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
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))
}
}
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)];
}