web-dev-qa-db-fra.com

Ajouter une marge gauche à UITextField

Je souhaite placer la marge gauche du texte de UITextField à 10 px Quelle est la meilleure façon de le faire?

21
iOSPawan

Comme je l'ai expliqué dans un commentaire précédent, la meilleure solution dans ce cas est d'étendre la classe UITextField au lieu d'utiliser une catégorie, de sorte que vous puissiez l'utiliser explicitement dans les champs de texte souhaités.

#import <UIKit/UIKit.h>

@interface MYTextField : UITextField

@end


@implementation MYTextField

- (CGRect)textRectForBounds:(CGRect)bounds {
    int margin = 10;
    CGRect inset = CGRectMake(bounds.Origin.x + margin, bounds.Origin.y, bounds.size.width - margin, bounds.size.height);
    return inset;
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
    int margin = 10;
    CGRect inset = CGRectMake(bounds.Origin.x + margin, bounds.Origin.y, bounds.size.width - margin, bounds.size.height);
    return inset;
}

@end

Une catégorie est destinée à ajouter de nouvelles fonctions à une classe existante, pas à remplacer une méthode existante.

18
clopez

Vous pouvez le faire en étendant la classe UITextField et en surchargeant deux méthodes:

- (CGRect)textRectForBounds:(CGRect)bounds;
- (CGRect)editingRectForBounds:(CGRect)bounds;

Voici le code:

L'interface dans MYTextField.h

@interface MYTextField : UITextField

@end

Son implémentation dans MYTextField.m

@implementation MYTextField

static CGFloat leftMargin = 28;

 - (CGRect)textRectForBounds:(CGRect)bounds
{
    bounds.Origin.x += leftMargin;

    return bounds;
}

 - (CGRect)editingRectForBounds:(CGRect)bounds
{
    bounds.Origin.x += leftMargin;

    return bounds;
}
@end
43
Riad Krim
UITextField * textField = [[UITextField alloc]init];
[textField setDelegate:self];
[textField setFrame:CGRectMake(170,112,140,25)];
[textField setBorderStyle:UITextBorderStyleNone];
[textField setBackgroundColor:[UIColor clearColor]];
[self.View addSubview:noofChildTField];

UIView *paddingView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 20)] autorelease];
textField.leftView = paddingView;
textField.leftViewMode = UITextFieldViewModeAlways;

Essayez ce code

11
btmanikandan

Pour Swift 3:

Créez un point de vente de UITextField, dites usernameTextField. Puis écrivez le code suivant dans viewDidLoad()

let paddingView : UIView = UIView(frame: CGRect(x: 0, y: 0, width: 5, height: 20))
usernameTextField.leftView = paddingView
usernameTextField.leftViewMode = .always

Changez le width: 5 en une valeur supérieure si vous avez besoin de plus d’espace.

7
Mamta

J'espérais voir un paramètre dans IB dans l'inspecteur de propriétés pour ajuster cette valeur. Il s'est avéré que j'avais réglé par inadvertance le style d'alignement et de bordure sur les valeurs en désordre avec le remplissage de gauche. 

Vous ne penseriez pas que ce serait un gros problème de choisir la justification à gauche et l’absence de frontière, mais cela fait que les mots se chevauchent ou viennent directement au bord de la boîte et que cela ne semble pas correct. 

Mal:

 enter image description here

Bien:

 enter image description here

Je l'ai corrigé correctement. J'espère que cela aide aussi quelqu'un d'autre.

3
Ethan Parker

j'ai atteint presque en annulant - (CGRect)textRectForBounds:(CGRect)bounds. maintenant, c’est quand TextField passe en mode édition que sa marge gauche est réinitialisée à zéro .......

@implementation UITextField(UITextFieldCatagory)

- (CGRect)textRectForBounds:(CGRect)bounds {
    CGRect theRect=CGRectMake(bounds.Origin.x+10, bounds.Origin.y, bounds.size.width-10, bounds.size.height);
    return theRect;


}
1
iOSPawan

Pour Swift 4 :

Je préfère utiliser les propriétés IBDesignable class et IBInspectable pour me permettre de définir le remplissage à l'aide de storyboards Xcode et de le garder réutilisable. J'ai également mis à jour le code pour qu'il fonctionne dans Swift 4.

import Foundation
import UIKit

@IBDesignable
class PaddableTextField: UITextField {

    var padding = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: 0.0)

    @IBInspectable var left: CGFloat = 0 {
        didSet {
            adjustPadding()
        }
    }

    @IBInspectable var right: CGFloat = 0 {
        didSet {
            adjustPadding()
        }
    }

    @IBInspectable var top: CGFloat = 0 {
        didSet {
            adjustPadding()
        }
    }

    @IBInspectable var bottom: CGFloat = 0 {
        didSet {
            adjustPadding()
        }
    }

    func adjustPadding() {
         padding = UIEdgeInsets(top: top, left: left, bottom: bottom, right: right)

    }

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
    }

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: UIEdgeInsets(top: top, left: left, bottom: bottom, right: right))
    }

    override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: UIEdgeInsets(top: top, left: left, bottom: bottom, right: right))
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
         return bounds.inset(by: UIEdgeInsets(top: top, left: left, bottom: bottom, right: right))
    }
}
0
Payne Miller