Ajouter des marges à un UILabel ou un UITextField

Cet article est libre d'accès pour tous grâce à ceux qui soutiennent notre blog indépendant.

J’ai récemment rencontré un problème lors du développement d’une application (qui sortira bientôt) : je voulais mettre des marges intérieures à mes labels et pas moyen de trouver une méthode de la class UILabel qui le fait. J’ai détourné le problème en rajoutant moi même les méthodes dont j’avais besoin, voici ce que j’ai fait :

1) UILabel

Pour commencer on va créer une class qui hérite de la class UILabel. C’est la classe fille que l’on va ensuite utiliser pour créer des labels ailleurs dans notre application.

#import <UIKit/UIKit.h> 

@interface NCLabel : UILabel 
@end

Ensuite, on y ajoute des variables, ainsi que leur setters pour stocker et modifier la marges du haut, du bas, de gauche et de droite. Libre à vous de rajouter des getters à votre classe pour récupérer les différentes marges si vous en avez besoin ailleurs dans votre code.

#import <UIKit/UIKit.h> 

@interface NCLabel : UILabel { 
    CGFloat _topInset; 
    CGFloat _leftInset; 
    CGFloat _bottomInset; 
    CGFloat _rightInset; 
} 

- (void) setTopInset:(CGFloat)topInset; 
- (void) setBottomInset:(CGFloat)bottomInset; 
- (void) setLeftInset:(CGFloat)leftInset; 
- (void) setRightInset:(CGFloat)rightInset; 

@end

Dans le fichier d’implémentation, en plus de vos setters, décommentez ou ajouter la fonction suivante :

#import "NCLabel.h" 

@implementation NCLabel 
- (id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
    } 

    return self; 
} 

// Only override drawRect: if you perform custom drawing. 
// An empty implementation adversely affects performance during animation. 
- (void)drawRect:(CGRect)rect { 
    UIEdgeInsets insets = {
        self->_topInset, 
        self->_leftInset, 
        self->_bottomInset, 
        self->_rightInset
    };
 
    return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)]; 
} 

- (void) setTopInset:(CGFloat)topInset {
    self->_topInset = topInset; 
} 

- (void) setBottomInset:(CGFloat)bottomInset { 
    self->_bottomInset = bottomInset; 
} 

- (void) setLeftInset:(CGFloat)leftInset{ 
    self->_leftInset = leftInset; 
} 

- (void) setRightInset:(CGFloat)rightInset{ 
    self->_rightInset = rightInset; 
} 

@end

Voilà, vous pouvez maintenant ajouter des marges à vos nouveaux label très simplement. J’ai eu le même problème avec les UITextField mais la méthode précédente ne fonctionnait pas, alors je profite de cet article pour vous donner la solution.

2) UITextField

Là aussi, on va créer une classe qui héritera de la classe UITextField. On y ajoutera variables et setters. Puis on surchargera deux méthodes de la classe pour modifier son affichage. Je vous copie mon .h :

#import <UIKit/UIKit.h> 

@interface NCTextField : UITextField{ 
    CGFloat _horizontalInset; 
    CGFloat _verticalInset; 
} 

- (void) setHorizontalInset:(CGFloat)horizontalInset; 
- (void) setVerticalInset:(CGFloat)verticalInset; 

@end

Et mon .m :

#import "NCTextField.h" 

@implementation NCTextField 

- (id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
        // Initialization code 
    } 

    return self; 
} 

- (CGRect)textRectForBounds:(CGRect)bounds { 
    return CGRectInset( bounds , self->_horizontalInset , self->_verticalInset); 
} 

// text position 
- (CGRect)editingRectForBounds:(CGRect)bounds { 
    return CGRectInset( bounds , self->_horizontalInset , self->_verticalInset ); 
} 

- (void) setHorizontalInset:(CGFloat)horizontalInset{
    self->_horizontalInset = horizontalInset; 
} 

- (void) setVerticalInset:(CGFloat)verticalInset{ 
    self->_verticalInset = verticalInset; 
} 

@end

Normalement vous devriez comprendre !

Rejoins 250+ développeurs de notre liste de diffusion et sois reçois les articles directement dans ta boite mail.

S'inscrire à la newsletter

Aucun spam. Désabonnes-toi en un seul clic à tout moment.

Si vous avez des questions ou des remarques/conseils, n'hésitez pas à laisser un commentaire plus bas ! Je serais ravis de vous lire. Et si vous aimez l'article, n'oubliez pas de le partager avec vos amis.