[iOS] Ajouter des marges à un UILabel ou un UITextField

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 !

Nathanaël Cherrier

Ingenieur de développement mobile et web pour Econocom. Passionné par le développement en général, mais plus particulièrement par le développement web et mobile, je vous raconte mes petits secrets.

Subscribe to Mindsers IT

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!