Imposta il riempimento per UITextField con UITextBorderStyleNone


399

Volevo usare uno sfondo personalizzato per il mio UITextFields. Funziona bene, tranne per il fatto che devo usarlo UITextBorderStyleNoneper renderlo carino. In questo modo il testo si attacca a sinistra senza alcuna imbottitura.

Posso impostare manualmente un'imbottitura in modo che appaia simile UITextBorderStyleRoundedRecttranne per l'utilizzo della mia immagine di sfondo personalizzata?

Risposte:


837

Ho trovato un piccolo trucco per impostare l'imbottitura sinistra per questa situazione esatta.

Fondamentalmente, imposti la proprietà leftView di UITextFieldcome una vista vuota della dimensione del pad che desideri:

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

Ha funzionato benissimo per me!

In Swift 3 / Swift 4 , è possibile farlo

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

1
Esattamente quello di cui avevo bisogno, tranne per il fatto che avevo bisogno di un'imbottitura a destra che è per lo più la stessa, ovviamente. Grazie!
cg.

@Lukasz Ho aggiunto un rilascio automatico a questa risposta, la risposta accettata. Prima linea. EDIT: oops, forse non ho salvato? o la mia modifica è stata rifiutata? In entrambi i casi, Vincent ha aggiunto un rilascio automatico, quindi per quello!
Eric Goldberg,

1
Utilizzando ARC, perché la mia app si blocca e utilizza molta CPU se riutilizzo *paddingViewcon più campi di testo?
The Muffin Man,

3
È una cattiva soluzione, meglio scegliere quella di Nate Flink. Questo non include l'imbottitura in modalità editiong.
Jacek Kwiecień,

3
Non funziona con più campi di testo. Consuma solo tanta memoria e si blocca in seguito.
gabbia per uccelli

177

Ho creato l'implementazione di questa categoria e l'ho aggiunta all'inizio del .mfile.

@implementation UITextField (custom)
    - (CGRect)textRectForBounds:(CGRect)bounds {
        return CGRectMake(bounds.origin.x + 10, bounds.origin.y + 8,
                          bounds.size.width - 20, bounds.size.height - 16);
    }
    - (CGRect)editingRectForBounds:(CGRect)bounds {
        return [self textRectForBounds:bounds];
    }
@end

Basato sul link fornito da Piotr Blasiak. Sembrava più semplice quindi creare una sottoclasse completamente nuova e anche più semplice aggiungere l'aggiunta UIView. Tuttavia, sembra che manchi qualcosa per non poter controllare il riempimento all'interno di un campo di testo.

Soluzione Swift 4:

class CustomTextField: UITextField {
    struct Constants {
        static let sidePadding: CGFloat = 10
        static let topPadding: CGFloat = 8
    }

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return CGRect(
            x: bounds.origin.x + Constants.sidePadding,
            y: bounds.origin.y + Constants.topPadding,
            width: bounds.size.width - Constants.sidePadding * 2,
            height: bounds.size.height - Constants.topPadding * 2
        )
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return self.textRect(forBounds: bounds)
    }
}

6
Questo genera avvisi sui metodi di sostituzione delle categorie. Vedi questa risposta per sopprimerli.
pdenya,

5
Preferisco non farlo in una categoria, ma a parte questo è una soluzione più pulita della risposta accettata.
Bob Vork,

2
È meglio usare CGRectInset () per qualcosa del genere, invece di creare il proprio. È anche un po 'più pulito: restituisce CGRectInset (limiti, 10, 8);
Dennis Munsie,

1
@shashwat sì, puoi specificare qualsiasi imbottitura tu voglia
Ege Akpinar,

1
Quando l'ho aggiunto 4 anni fa, le cose erano diverse con iOS e sono d'accordo che ora è meglio creare una sottoclasse. Tuttavia, se vuoi solo un modo veloce e sporco per ispezionare visivamente le distanze dei pixel, questo lo farà;) Quindi va bene per le persone continuare a votare !!
Nate Flink,

139

Una versione di Swift 3 per Xcode> 6, in cui puoi modificare il valore dell'inserzione in Interface Builder / Storyboard.

import UIKit

@IBDesignable
class FormTextField: UITextField {

    @IBInspectable var inset: CGFloat = 0

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.insetBy(dx: inset, dy: inset)
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return textRect(forBounds: bounds)
    }

}

inserisci qui la descrizione dell'immagine


1
Non vedo il campo di testo del modulo sul mio.
okysabeni,

2
Avevo bisogno di aggiungere questa rigaoverride func placeholderRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds, inset, inset) }
Michael,

2
Questa risposta sarebbe più utile con una spiegazione o un collegamento alla spiegazione di cosa @IBDesignablee cosa @IBInspectablefare, vale a dire questo post presso nshipster
Russell Austin,

1
Se si fa affidamento su viste accessorie (come la funzionalità del pulsante Cancella su UITextField) return super.textRectForBounds(CGRectInset(bounds, inset, inset)), la gestione delle compensazioni dalle viste accessorie verrà gestita correttamente.
Mike Fay,

@okysabeni è necessario fare clic sul campo di testo e modificare la classe in FormTextField
Gustavo Barbosa

77

Modifica: funziona ancora su iOS 11.3.1

In iOS 6 myTextField.leftView = paddingView;sta causando problemi

Questo risolve il problema

myTextField.layer.sublayerTransform = CATransform3DMakeTranslation(5, 0, 0)

Per il campo di testo allineato a destra, utilizzare CATransform3DMakeTranslation(-5, 0, 0)come citato da latenitecoder nei commenti


1
Bene, ho dovuto mettere il riempimento in tutti i campi di testo dell'app, ho creato una categoria di UITextField e ho inserito questo codice - (vuoto) awakeFromNib {} e questo ha risolto il mio problema
Teena nath Paul

Così semplice! Grazie :) Ho una domanda come posso fare un semplice codice per rendere tutto UITextField invece di scrivere il codice più volte?
Luai Kalkatawi,

1
Tutti gli altri commenti presuppongono che tu voglia riempire un UITextField da sinistra. La sottoclasse è un sacco di overhead per aggiungere un po 'di id di spaziatura piuttosto che aggiungere solo alcuni caratteri vuoti ma questa soluzione è LA soluzione. Una linea a prova di futuro. Se stai lavorando con un campo di testo allineato a destra, usa il valore meno (-5,0,0) Grazie Inder
latenitecoder

1
Dopo 4 anni ho trovato la mia risposta: D, @latenitecoder il tuo commento è stato quello che è necessario. Aggiornamento della risposta
Inder Kumar Rathore

1
cosa posso fare se voglio sia l'imbottitura destra che sinistra ??
Mina Hanna,

70

Un buon approccio per aggiungere il riempimento a UITextField è la sottoclasse e l'aggiunta di una proprietà edgeInsets. Quindi impostare edgeInsets e UITextField verrà disegnato di conseguenza. Funzionerà anche correttamente con un set personalizzato leftView o rightView.

OSTextField.h

#import <UIKit/UIKit.h>

@interface OSTextField : UITextField

@property (nonatomic, assign) UIEdgeInsets edgeInsets;

@end

OSTextField.m

#import "OSTextField.h"

@implementation OSTextField

- (id)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
        self.edgeInsets = UIEdgeInsetsZero;
    }
    return self;
}

-(id)initWithCoder:(NSCoder *)aDecoder{
    self = [super initWithCoder:aDecoder];
    if(self){
        self.edgeInsets = UIEdgeInsetsZero;
    }
    return self;
}

- (CGRect)textRectForBounds:(CGRect)bounds {
    return [super textRectForBounds:UIEdgeInsetsInsetRect(bounds, self.edgeInsets)];
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
    return [super editingRectForBounds:UIEdgeInsetsInsetRect(bounds, self.edgeInsets)];
}

@end

Questa dovrebbe essere una risposta accettata. Funziona anche per le viste destra e sinistra ..
NSPratik,

25

Sottoclasse UITextField in questo modo:

@implementation DFTextField


- (CGRect)textRectForBounds:(CGRect)bounds
{
    return CGRectInset(bounds, 10.0f, 0);
}

- (CGRect)editingRectForBounds:(CGRect)bounds
{
    return [self textRectForBounds:bounds];
}


@end

Ciò aggiunge un'imbottitura orizzontale di 10 punti per lato.


21

Codice obiettivo C.

MyTextField.h

#import <UIKit/UIKit.h>

@interface MyTextField : UITextField

@property (nonatomic) IBInspectable CGFloat padding;

@end

MyTextField.m

#import "MyTextField.h"

IB_DESIGNABLE
@implementation MyTextField

@synthesize padding;

-(CGRect)textRectForBounds:(CGRect)bounds{
    return CGRectInset(bounds, padding, padding);
}

-(CGRect)editingRectForBounds:(CGRect)bounds{
    return [self textRectForBounds:bounds];
}

@end

inserisci qui la descrizione dell'immagine



20
  1. Crea un campo di testo personalizzato

PaddingTextField.swift

import UIKit
class PaddingTextField: UITextField {

@IBInspectable var paddingLeft: CGFloat = 0
@IBInspectable var paddingRight: CGFloat = 0

override func textRectForBounds(bounds: CGRect) -> CGRect {
    return CGRectMake(bounds.origin.x + paddingLeft, bounds.origin.y,
        bounds.size.width - paddingLeft - paddingRight, bounds.size.height);
}

override func editingRectForBounds(bounds: CGRect) -> CGRect {
    return textRectForBounds(bounds)
}}
  1. Imposta la classe del tuo campo di testo su PaddingTextField e personalizza il tuo riempimento come desideri inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

  2. Divertirsi

finale


19

Sulla base della risposta di Evil Trout potresti voler creare una categoria per renderne più semplice l'utilizzo su più applicazioni.

File di intestazione:

@interface UITextField (PaddingText)

-(void) setLeftPadding:(int) paddingValue;

-(void) setRightPadding:(int) paddingValue;
@end

File di implementazione:

#import "UITextField+PaddingText.h"

@implementation UITextField (PaddingText)

-(void) setLeftPadding:(int) paddingValue
{
    UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, paddingValue, self.frame.size.height)];
    self.leftView = paddingView;
    self.leftViewMode = UITextFieldViewModeAlways;
}

-(void) setRightPadding:(int) paddingValue
{
    UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, paddingValue, self.frame.size.height)];
    self.rightView = paddingView;
    self.rightViewMode = UITextFieldViewModeAlways;
}

@end

Esempio di utilizzo

#import "UITextField+PaddingText.h"

[self.YourTextField setLeftPadding:20.0f];

Spero che ti aiuti ragazzi

Saluti


14

Versione rapida:

extension UITextField {
    @IBInspectable var padding_left: CGFloat {
        get {
            LF.log("WARNING no getter for UITextField.padding_left")
            return 0
        }
        set (f) {
            layer.sublayerTransform = CATransform3DMakeTranslation(f, 0, 0)
        }
    }
}

In modo che tu possa assegnare valore in IB

IB Impostazione impostabile rappresentata in Interface Builder


IBInspectableti permette di applicare il codice setter in fase di esecuzione, quindi inserisci semplicemente il tuo numero Interface Buildere funzionerà.
superarts.org

Questo non funzionerà quando hai Clear Button. Il pulsante Cancella non sarà visibile se si applica questa soluzione.
Bhavin_m

11

Non è possibile impostare il riempimento. Invece ha un UIViewche ha la tua immagine di sfondo e l' UITextFieldinterno di essa. Impostare la UITextFieldlarghezza come UIViewWidth-(paddingSize x 2)e l'altezza in modo simile e quindi impostarlo nel punto paddingSize,paddingSize.


10

Sottoclasse UITextField in questo modo ( versione Swift ):

import UIKit

class CustomTextField: UITextField {

    override func textRectForBounds(bounds: CGRect) -> CGRect {
       return CGRectInset(bounds, 25.0, 0)
    }

    override func editingRectForBounds(bounds: CGRect) -> CGRect {
       return self.textRectForBounds(bounds)
    }

}

Ciò aggiunge un'imbottitura orizzontale di 25,0 punti su entrambi i lati.


8

Ero basato sulla soluzione di Nate, ma poi ho scoperto che ciò causa problemi quando si utilizzano le proprietà leftView / rightView, quindi è meglio ottimizzare l'implementazione del super, perché terrà conto della vista sinistra / destra.

- (CGRect)textRectForBounds:(CGRect)bounds {
    CGRect ret = [super textRectForBounds:bounds];
    ret.origin.x = ret.origin.x + 5;
    ret.size.width = ret.size.width - 10;
    return ret;
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
    return [self textRectForBounds:bounds];
}

6

Versione aggiornata per Swift 3:

@IBDesignable
class FormTextField: UITextField {

    @IBInspectable var paddingLeft: CGFloat = 0
    @IBInspectable var paddingRight: CGFloat = 0

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return CGRect(x: bounds.origin.x + paddingLeft, y: bounds.origin.y, width: bounds.size.width - paddingLeft - paddingRight, height: bounds.size.height)
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return textRect(forBounds: bounds)
    }
}

6

Imposta il riempimento per UITextField con UITextBorderStyleNone: Swift

Sulla base della risposta più votata di @Evil Trout, ho creato un metodo personalizzato nella mia classe ViewController, come mostrato di seguito:

- (void) modifyTextField:(UITextField *)textField
{
    UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 20)];
    textField.leftView = paddingView;
    textField.leftViewMode = UITextFieldViewModeAlways;
    textField.rightView = paddingView;
    textField.rightViewMode = UITextFieldViewModeAlways;

    [textField setBackgroundColor:[UIColor whiteColor]];
    [textField setTextColor:[UIColor blackColor]];
}

Ora posso chiamare quel metodo all'interno (metodo viewDidLoad) e inviare uno qualsiasi dei miei campi di testo a quel metodo e aggiungere il riempimento sia a destra che a sinistra e dare testo e colori di sfondo scrivendo solo una riga di codice, come segue:

[self modifyTextField:self.firstNameTxtFld];

Funzionava perfettamente su iOS 7! So che l'aggiunta di troppe viste potrebbe rendere questa classe un po 'più pesante da caricare. Ma quando sono preoccupato per la difficoltà di altre soluzioni, mi sono trovato più parziale a questo metodo e più flessibile nell'uso di questo modo. ;)

Grazie per l'hack "Evil Trout"! (arco)

Ho pensato di aggiornare lo snippet di codice di questa risposta con Swift:

Poiché Swift ci consente di scrivere estensioni per le classi esistenti, scriviamola in quel modo.

extension UITextField {
    func addPaddingToTextField() {
        let paddingView: UIView = UIView.init(frame: CGRectMake(0, 0, 8, 20))
        self.leftView = paddingView;
        self.leftViewMode = .Always;
        self.rightView = paddingView;
        self.rightViewMode = .Always;


        self.backgroundColor = UIColor.whiteColor()
        self.textColor = UIColor.blackColor()
    }
}

Uso:

self.firstNameTxtFld.addPaddingToTextField()

Spero che questo possa essere utile a qualcun altro là fuori!
Saluti!


5

Ecco come ottenere questo risultato in SWIFT

@IBOutlet weak var yourTextField: UITextField!

override func viewDidLoad() {
super.viewDidLoad()
let paddingView = UIView(frame: CGRectMake(0, 0, 10, self.yourTextField.frame.height))
yourTextField.leftView = paddingView
yourTextField.leftViewMode = UITextFieldViewMode.Always
}
}

Risorsa


5

Versione Swift 2.0:

let paddingView: UIView = UIView(frame: CGRectMake(0, 0, 5, 20))
textField.leftView = paddingView
textField.leftViewMode = UITextFieldViewMode.Always;

4

^ questi suggerimenti sono ottimi per coloro che stanno creando un'interfaccia a livello di codice.

Ma ci sono due MODI FACILMENTE FANTASTICI per quelli di noi che usano il builder di interfaccia Xcode:

  • più semplice: inserisci un UIImageView dietro un campo di testo

  • più semplice: cambia lo stile del bordo sul tuo semplice quadrato nero (seconda opzione da sinistra), quindi aggiungi la tua immagine come immagine di sfondo. L'immagine ha la precedenza sul quadrato, quindi ottieni ancora il riempimento necessario per uno sfondo normale dell'immagine, senza che il quadrato sia effettivamente disegnato.

EDIT: puoi anche usare la sfera nera (terza opzione da sinistra quando selezioni UITextBox in IB), non funziona con lo stile "sfera grafica" all'estrema destra.


La tua soluzione più semplice è in effetti una scelta valida in alcuni casi, ma la soluzione più semplice è un hack, che non funziona anche se i pixel dei bordi della tua immagine hanno un'alfa variabile (per non parlare del fatto che Apple potrebbe cambiare la loro implementazione in una futura versione di iOS).
jmdecombe,

Non sono in disaccordo con te, ecco perché ho messo "pigro modo semplice" in lettere maiuscole. Ha funzionato bene per me fino ad oggi.
woody121,

4

Se qualcuno è alla ricerca di una Swift 4.0versione, allora sotto extensionfunziona. Ha sia Lefte Rightimbottitura perUITextField . In realtà è IBInspectableper la configurazione dello storyboard. È possibile impostare il valore direttamente da Interface Builder / Storyboard. Questo è un codice testato nella versione Swift 4.0 e Xcode 9.0

Tieni presente che se vuoi abilitare Clear Buttonlo stesso, devi UITextFieldmantenere vuoto il padding destro.

import UIKit

extension UITextField {

    @IBInspectable var paddingLeft: CGFloat {
        get {
            return leftView!.frame.size.width
        }
        set {
            let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: newValue, height: frame.size.height))
            leftView = paddingView
            leftViewMode = .always
        }
    }

    @IBInspectable var paddingRight: CGFloat {
        get {
            return rightView!.frame.size.width
        }
        set {
            let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: newValue, height: frame.size.height))
            rightView = paddingView
            rightViewMode = .always     
        }
    }
}  

3

Il modo migliore per farlo è semplicemente creare una classe usando la sottoclasse di UITextField e nel file .m

 #import "CustomTextField.h"
 #import <QuartzCore/QuartzCore.h>
 @implementation CustomTextField


- (id)initWithCoder:(NSCoder*)coder 
 {
  self = [super initWithCoder:coder];

  if (self) {

//self.clipsToBounds = YES;
//[self setRightViewMode:UITextFieldViewModeUnlessEditing];

self.leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0,15,46)];
self.leftViewMode=UITextFieldViewModeAlways;
   }

  return self;

 }

facendo questo vai sul tuo storyboard o xib e fai clic su Inspector identità e sostituisci UITextfield con la tua opzione "CustomTextField" nella classe.

Nota: se si fornisce semplicemente un'imbottitura con layout automatico per il campo di testo, l'applicazione non verrà eseguita e verrà visualizzata solo una schermata vuota.


3

Versione Swift 3:

class CustomTextField:UITextField{

    required init?(coder aDecoder: NSCoder){
        super.init(coder: aDecoder)
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return CGRect.init(x: bounds.origin.x + 8, y: bounds.origin.y, width: bounds.width, height: bounds.height)
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return self.textRect(forBounds:bounds)
    }
}

2

La risposta di Nate Flink è la mia preferita, ma non dimenticare le visualizzazioni destra / sinistra. Ad esempio per la UITextFieldsottoclasse:

override func rightViewRectForBounds(bounds: CGRect) -> CGRect {
    let rightViewBounds = super.rightViewRectForBounds(bounds)

    return CGRectMake(CGRectGetMinX(rightViewBounds) - 10, CGRectGetMinY(rightViewBounds), CGRectGetWidth(rightViewBounds), CGRectGetHeight(rightViewBounds))
}

Sopra il codice impostare l'imbottitura giusta per rightViewof UITextField.


2

Soluzione Swift 3

class CustomTextField: UITextField {

 override func textRect(forBounds bounds: CGRect) -> CGRect {
  return CGRect(x: bounds.origin.x + 10, y: bounds.origin.y + 8, width: bounds.size.width - 20, height: bounds.size.height - 16)
 }

 override func editingRect(forBounds bounds: CGRect) -> CGRect {
  return self.textRect(forBounds: bounds)
 }
}

2

Ecco un codice Swift per dare il riempimento in UITextfield

 func txtPaddingVw(txt:UITextField) {
     let paddingView = UIView(frame: CGRectMake(0, 0, 10, 10))
     txt.leftViewMode = .Always
     txt.leftView = paddingView
 }

e chiama usando

self.txtPaddingVw(txtPin)

2

puoi usare la categoria. imposta l'imbottitura a sinistra e a destra

UITextField + Padding.h

@interface UITextField (Padding)
@property (nonatomic, assign) CGFloat paddingValue;
@property (nonatomic, assign) CGFloat leftPadding;
@property (nonatomic, assign) CGFloat rightPadding;

//overwrite
-(CGRect)textRectForBounds:(CGRect)bounds;
-(CGRect)editingRectForBounds:(CGRect)bounds;
@end

UITextField + Padding.m

#import "UITextField+Padding.h"
#import <objc/runtime.h>

static char TAG_LeftPaddingKey;
static char TAG_RightPaddingKey;
static char TAG_Left_RightPaddingKey;

@implementation UITextField (Padding)

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
-(CGRect)textRectForBounds:(CGRect)bounds {

CGFloat offset_Left=0;
CGFloat offset_Right=0;
if (self.paddingValue>0) {
    offset_Left=self.paddingValue;
    offset_Right=offset_Left;
}else{
    if (self.leftPadding>0){
        offset_Left=self.leftPadding;
    }
    if (self.rightPadding>0){
        offset_Right=self.rightPadding;
    }
}

if (offset_Left>0||offset_Right>0) {
    return CGRectMake(bounds.origin.x+ offset_Left ,bounds.origin.y ,
                      bounds.size.width- (offset_Left+offset_Right), bounds.size.height-2 );
 }else{
    return bounds;
 }
}



-(CGRect)editingRectForBounds:(CGRect)bounds {
    return [self textRectForBounds:bounds];
}
#pragma clang diagnostic pop


#pragma maek -setter&&getter
- (CGFloat)paddingValue
{
    return [objc_getAssociatedObject(self,&TAG_Left_RightPaddingKey) floatValue];
}
-(void)setPaddingValue:(CGFloat)paddingValue
{
    objc_setAssociatedObject(self, &TAG_Left_RightPaddingKey, @(paddingValue), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

-(CGFloat)leftPadding
{
    return [objc_getAssociatedObject(self,&TAG_LeftPaddingKey) floatValue];
}

-(void)setLeftPadding:(CGFloat)leftPadding
{
    objc_setAssociatedObject(self, &TAG_LeftPaddingKey, @(leftPadding), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

-(CGFloat)rightPadding
{
    return [objc_getAssociatedObject(self,&TAG_RightPaddingKey) floatValue];
}

-(void)setRightPadding:(CGFloat)rightPadding
{
    objc_setAssociatedObject(self, &TAG_RightPaddingKey, @(rightPadding), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end

puoi impostare il padding in questo modo self.phoneNumTF.paddingValue = 10.f; o self.phoneNumTF.leftPadding = 10.f;


1

La risposta di @Evil Trout è ottima. Uso questo approccio da un po 'di tempo ormai. L'unica cosa che manca è "occuparsi di numerosi campi di testo". Ho provato altri approcci ma non sembra funzionare.

Sottoclasse UITextField solo per aggiungere un'imbottitura non aveva alcun senso per me. Quindi, ho iterato su tutti gli UITextFields per aggiungere il padding.

-(void) addPaddingToAllTextFields:(UIView*)view {

    for(id currentView in [view subviews]){
        if([currentView isKindOfClass:[UITextField class]]) {
            // Change value of CGRectMake to fit ur need
            [currentView setLeftView:[[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 20)]];
            [currentView setLeftViewMode:UITextFieldViewModeAlways];
        }

        if([currentView respondsToSelector:@selector(subviews)]){
            [textfieldarray addObjectsFromArray:[self addPaddingToAllTextFields:currentView]];
        }
    }
}

il metodo può essere chiamato da [self addPaddingToAllTextFields: [self view]];
Kishor Kundan,

Dato che textfieldarraynon è definito nel secondo ifblocco, ho usato questo frammento (grazie!) Con successo dopo aver sostituito il contenuto del secondo ifconfor(id subSubView in [view subviews]){[self addPaddingToAllTextFields:subSubView];}
adamup

1

La soluzione di Brody ha funzionato perfettamente per me. Ho dovuto aggiungere viste laterali su un campo di testo e aggiungere un'imbottitura aggiuntiva. Quindi implementando la proprietà UIEdgeInsets personalizzata in una sottoclasse UITextField sono riuscito a raggiungere il compito. Userò questa nuova sottoclasse in tutti i miei progetti.


1

La migliore soluzione che ho trovato finora è una categoria. È così che aggiungo un'imbottitura di 5 punti a sinistra e a destra:

@implementation UITextField (Padding)

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
- (CGRect)textRectForBounds:(CGRect)bounds {
    return CGRectMake(bounds.origin.x + 5, bounds.origin.y,
                      bounds.size.width - 10, bounds.size.height);
}
- (CGRect)editingRectForBounds:(CGRect)bounds {
    return [self textRectForBounds:bounds];
}
#pragma clang diagnostic pop

@end

I # pragma sono solo per rimuovere i fastidiosi avvertimenti


Il problema con il sovraccarico del metodo nelle categorie è che verrà contrassegnato come inutilizzato in AppCode, che in realtà è. Buona idea, ma non molto sicura perché si rimuove facilmente quando si esegue "Ottimizza importazioni" (nessun problema per gli utenti di Xcode, ma conosciamo tutti le funzionalità limitate
basate

1
È una categoria più semplice che applicherà il riempimento per tutti i campi di testo nell'app?
Ben Sinclair,

@Andy no si applica solo quando lo importi, dovrai creare una classe UITextField + Padding e importarla nel viewcontroller o classe hai un campo di testo con padding
Mongi Zaidi,

@MongiZaidi: ti sbagli. Viene collegato all'eseguibile, indipendentemente dal fatto che l'importazione sia irrilevante.
Zsolt Szatmari,

1
textField.layer.borderWidth = 3;

aggiungerò il bordo, che ha funzionato come imbottitura per me.


0

Un'altra considerazione è che, se ne hai più di uno in UITextFieldcui stai aggiungendo il riempimento, è quello di creare un campo separato UIViewper ogni campo di testo, perché non possono essere condivisi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.