Establecer relleno para UITextField con UITextBorderStyleNone

399

Quería usar un fondo personalizado para mi UITextFields. Esto funciona bien, excepto por el hecho de que tengo que usar UITextBorderStyleNonepara que se vea bonito. Esto obliga al texto a pegarse a la izquierda sin ningún relleno.

¿Puedo configurar un relleno manualmente para que se vea similar a UITextBorderStyleRoundedRectmenos que use mi imagen de fondo personalizada?

Sebastian Wramba
fuente

Respuestas:

837

Encontré un pequeño truco para establecer el relleno izquierdo para esta situación exacta.

Básicamente, establece la propiedad leftView de UITextFieldser una vista vacía del tamaño del relleno que desea:

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

¡Funcionó como un encanto para mí!

En Swift 3 / Swift 4 , se puede hacer haciendo eso

let paddingView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: 5, height: 20))
textField.leftView = paddingView
textField.leftViewMode = .always
Trucha malvada
fuente
1
Exactamente lo que necesitaba, excepto que necesitaba relleno a la derecha, que es casi lo mismo, por supuesto. ¡Gracias!
cg.
@Lukasz Agregué un lanzamiento automático a esta respuesta, la respuesta aceptada. Primera linea. EDITAR: oops, ¿tal vez no salvé? o mi edición fue rechazada? De cualquier manera, Vincent agregó en un lanzamiento automático, ¡así que sí!
Eric Goldberg
1
Usando ARC, ¿por qué mi aplicación se cuelga y usa mucha CPU si la reutilizo *paddingViewcon múltiples campos de texto?
The Muffin Man
3
Es una mala solución, mejor opta por la de Nate Flink. Thios one no incluye relleno de modo editiong.
Jacek Kwiecień
3
No funciona con múltiples campos de texto. Simplemente consume tanta memoria y luego se bloquea.
Jaula
177

Creé esta implementación de categoría y la agregué al principio del .marchivo.

@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

Basado en el enlace que Piotr Blasiak proporcionó. Parecía más simple que crear una subclase completamente nueva, y también más simple que agregar el adicional UIView. Aún así, parece que falta algo para no poder controlar el relleno dentro de un campo de texto.

Solución 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)
    }
}
Nate Flink
fuente
66
Esto arroja advertencias sobre los métodos de anulación de categorías. Vea esta respuesta para suprimirlos.
pdenya
55
Prefiero no hacerlo en una categoría, pero aparte de eso, esta es una solución más limpia que la respuesta aceptada.
Bob Vork
2
Es mejor usar CGRectInset () para algo como esto, en lugar de rodar el suyo. También es un poco más limpio: return CGRectInset (límites, 10, 8);
Dennis Munsie
1
@shashwat sí, puedes especificar cualquier relleno que quieras
Ege Akpinar
1
Cuando agregué esto hace 4 años, las cosas eran diferentes con iOS, y estoy de acuerdo en que ahora es mejor crear una subclase. Sin embargo, si solo desea una forma rápida y sucia de inspeccionar visualmente sus distancias de píxeles, esto lo hará;) ¡Entonces está bien que la gente siga votando!
Nate Flink
139

Una versión de Swift 3 para Xcode> 6, donde puede editar el valor del recuadro en 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)
    }

}

ingrese la descripción de la imagen aquí

bandejapaisa
fuente
1
No veo el campo de texto del formulario en el mío.
okysabeni
2
Necesitaba agregar esta líneaoverride func placeholderRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds, inset, inset) }
Michael
2
Esta respuesta sería más útil con una explicación o un enlace a la explicación de qué @IBDesignabley qué @IBInspectablehacer, es decir
Russell Austin
1
Si confía en las vistas de accesorios (como la funcionalidad del botón de borrado en UITextField) return super.textRectForBounds(CGRectInset(bounds, inset, inset)), manejará el desplazamiento de las vistas de accesorios correctamente.
Mike Fay
@okysabeni necesita hacer clic en su campo de texto y cambiar la Clase a FormTextField
Gustavo Barbosa
77

Editar: todavía funciona en iOS 11.3.1

En iOS 6 myTextField.leftView = paddingView;está causando problemas

Esto resuelve el problema

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

Para el campo de texto alineado a la derecha, use CATransform3DMakeTranslation(-5, 0, 0)como mención latenitecoder en los comentarios

Inder Kumar Rathore
fuente
1
Agradable, tuve que poner el relleno en todos los campos de texto de la aplicación, creé una categoría de UITextField y puse este código dentro - (nulo) awakeFromNib {} y esto resolvió mi problema
Teena nath Paul
¡Tan sencillo! Thx :) Tengo una pregunta, ¿cómo puedo hacer un código simple para hacer todo UITextField en lugar de escribir el código muchas veces?
Luai Kalkatawi
1
Todos los demás comentarios suponen que desea rellenar un UITextField desde la izquierda. Subclasificar es una gran cantidad de gastos generales para agregar alguna identificación de espacio en lugar de agregar algunos caracteres en blanco, pero esta solución es LA solución. Una línea a prueba de futuro. Si está trabajando con un campo de texto que está alineado a la derecha, use el valor negativo (-5,0,0) Gracias Inder
latenitecoder
1
Después de 4 años encontré mi propia respuesta: D, @latenitecoder tu comentario era lo que se necesitaba. Actualizando la respuesta
Inder Kumar Rathore
1
¿Qué puedo hacer si quiero relleno derecho e izquierdo?
Mina Hanna
70

Un buen enfoque para agregar relleno a UITextField es subclasificar y agregar una propiedad edgeInsets. Luego configura los edgeInsets y el UITextField se dibujará en consecuencia. Esto también funcionará correctamente con un conjunto personalizado 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
Brody Robertson
fuente
Esta debe ser la respuesta aceptada. También funciona para vistas derecha e izquierda ..
NSPratik
25

Simplemente subclase UITextField como este:

@implementation DFTextField


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

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


@end

Esto agrega un relleno horizontal de 10 puntos a cada lado.

Camsoft
fuente
21

Código del objetivo 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

ingrese la descripción de la imagen aquí

Kirit Vaghela
fuente
20
  1. Crear un campo de texto personalizado

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. Establezca su clase de campo de texto en PaddingTextField y personalice su relleno como desee ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

  2. Disfrútala

final

777Q
fuente
19

Según la respuesta de Evil Trout, es posible que desee crear una categoría para que sea más fácil de usar en múltiples aplicaciones.

Archivo de cabecera:

@interface UITextField (PaddingText)

-(void) setLeftPadding:(int) paddingValue;

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

Archivo de implementación:

#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

Ejemplo de uso

#import "UITextField+PaddingText.h"

[self.YourTextField setLeftPadding:20.0f];

Espero que te ayude chicos

Salud

Paulo Miguel Almeida
fuente
14

Versión rápida:

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)
        }
    }
}

Para que pueda asignar valor en IB

Configuración IBInspectable representada en Interface Builder

superarts.org
fuente
IBInspectablele permite aplicar el código de configuración en tiempo de ejecución, así que simplemente ingrese su número Interface Buildery funcionará.
superarts.org
Esto no funcionará cuando lo tengas Clear Button. Su botón de borrar no será visible si aplica esta solución.
Bhavin_m
11

No se puede configurar el relleno. En su lugar, tenga una UIViewque tenga su imagen de fondo y el UITextFieldinterior de la misma. Establezca el UITextFieldancho UIViewWidth-(paddingSize x 2)y la altura de manera similar y luego configúrelo en el punto paddingSize,paddingSize.

Thomas Clayson
fuente
10

Simplemente subclase UITextField como este ( versión 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)
    }

}

Esto agrega un relleno horizontal de 25.0 puntos a cada lado.

Rey Mago
fuente
8

Me basé en la solución de Nate, pero luego descubrí que esto causa problemas cuando usas las propiedades leftView / rightView, por lo que es mejor ajustar la implementación del super, porque tendrá en cuenta la vista izquierda / derecha.

- (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];
}
Stoto
fuente
6

Versión actualizada para 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)
    }
}
Beninho85
fuente
6

Establecer relleno para UITextField con UITextBorderStyleNone: Swift

Basado en la respuesta más votada de @Evil Trout, creé un método personalizado en mi clase ViewController, como se muestra a continuación:

- (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]];
}

Ahora puedo llamar a ese método dentro (método viewDidLoad) y enviar cualquiera de mis TextFields a ese método y agregar relleno para derecha e izquierda, y dar colores de texto y fondo escribiendo solo una línea de código, de la siguiente manera:

[self modifyTextField:self.firstNameTxtFld];

¡Esto funcionó perfectamente en iOS 7! Sé que agregar demasiadas Vistas podría hacer que esta clase sea un poco más pesada para cargar. Pero cuando me preocupaba la dificultad en otras soluciones, me encontré más predispuesto a este método y más flexible al usarlo de esta manera. ;)

Gracias por el truco "Evil Trout"! (arco)

Pensé que debería actualizar el fragmento de código de esta respuesta con Swift:

Como Swift nos permite escribir extensiones para las clases existentes, escribámoslo de esa manera.

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()

¡Espero que esto sea útil para alguien más por ahí!
¡Salud!

Randika Vishman
fuente
5

Aquí se explica cómo lograr esto en 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
}
}

Recurso

DrPatience
fuente
5

Versión Swift 2.0:

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

^ estas sugerencias son excelentes para aquellos que crean una interfaz mediante programación.

Pero hay dos LAZY EASY WAYS para aquellos de nosotros que usamos el generador de interfaces Xcode:

  • más fácil: coloque un UIImageView detrás de un campo de texto

  • más fácil: cambie el estilo de borde en su al cuadrado negro simple (segundo desde la opción izquierda), luego agregue su imagen como imagen de fondo. La imagen tiene prioridad sobre el cuadrado, por lo que aún obtiene el relleno necesario para un fondo de imagen normal, sin que el cuadrado se dibuje realmente.

EDITAR: también puede usar la esfera negra (tercera opción desde la izquierda al seleccionar UITextBox en IB), no funciona con el estilo de "esfera gráfica" del extremo derecho.

woody121
fuente
Su solución más fácil es una opción válida en algunos casos, pero su solución más fácil es un truco, que tampoco funciona si los píxeles del borde de su imagen tienen alfa variable (sin mencionar que Apple podría cambiar su implementación en una futura versión de iOS).
jmdecombe
No estoy en desacuerdo con usted, es por eso que pongo "manera fácil y perezosa" en mayúsculas. Ha funcionado bien para mí hasta la fecha.
woody121
4

Si alguien está buscando la Swift 4.0versión, a continuación se extensionencuentra el trabajo. Tiene ambos Lefty Rightrelleno para UITextField. En realidad es IBInspectablepara la configuración del guión gráfico. Puede establecer el valor directamente desde Interface Builder / Storyboard. Este es el código probado en la versión Swift 4.0 y Xcode 9.0

Tenga en cuenta que si desea habilitar Clear Buttonel mismo UITextField, debe mantener el relleno derecho en blanco.

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     
        }
    }
}  
Bhavin_m
fuente
3

La mejor manera de hacer esto es simplemente hacer una clase usando la subclase de UITextField y en el archivo .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;

 }

haciendo esto, vaya a su guión gráfico o xib y haga clic en el inspector de identidad y reemplace UITextfield con su propia opción "CustomTextField" en la clase.

Nota: Si simplemente proporciona relleno con diseño automático para el campo de texto, su aplicación no se ejecutará y mostrará solo la pantalla en blanco.

Anuj Kumar Rai
fuente
3

Versión 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)
    }
}
王怡飞
fuente
2

La respuesta de Nate Flink es mi favorita, pero no te olvides de las vistas derecha / izquierda. Por ejemplo, para la UITextFieldsubclase:

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

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

Por encima de código para establecer el relleno derecho rightViewde UITextField.

rafalkitta
fuente
2

Solución 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)
 }
}
Ben Sullivan
fuente
2

Aquí hay un código Swift para dar relleno en UITextfield

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

y llame usando

self.txtPaddingVw(txtPin)
Hardik Thakkar
fuente
2

Puedes usar la categoría. establecer el relleno a izquierda y derecha

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

puede establecer un relleno como este self.phoneNumTF.paddingValue = 10.f; o self.phoneNumTF.leftPadding = 10.f;

rikiluo
fuente
1

La respuesta de @Evil trout es genial. He estado usando este enfoque durante bastante tiempo. Lo único que le falta es "tratar con numerosos campos de texto". Intenté otros enfoques pero no parece funcionar.

Subclasificar UITextField solo para agregar un relleno no tenía ningún sentido para mí. Entonces, iteré sobre todos los UITextFields para agregar el relleno.

-(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]];
        }
    }
}
Kishor Kundan
fuente
el método puede ser llamado por [self addPaddingToAllTextFields: [self view]];
Kishor Kundan
Como textfieldarrayno está definido en el segundo ifbloque, usé este fragmento (¡gracias!) Con éxito después de reemplazar el contenido del segundo ifconfor(id subSubView in [view subviews]){[self addPaddingToAllTextFields:subSubView];}
adamup
1

La solución de Brody funcionó perfecta para mí. He tenido que agregar vistas laterales en un campo de texto y agregar relleno adicional. Entonces, al implementar la propiedad personalizada UIEdgeInsets en una subclase de UITextField, he logrado realizar la tarea. Voy a usar esta nueva subclase en todos mis proyectos.

Lubakis
fuente
1

La mejor solución que encontré hasta ahora es una categoría. Así es como agrego un relleno de 5 puntos a izquierda y derecha:

@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

Los # pragma son solo para eliminar las molestas advertencias

Mongi Zaidi
fuente
Lo que sucede con la sobrecarga de métodos en las categorías es que se marcará como no utilizado en AppCode, que de hecho es. Buena idea, pero no muy segura porque se elimina fácilmente cuando ejecuta "Optimizar importaciones" (sin embargo, no es un problema para los usuarios de Xcode, pero todos conocemos las características limitadas centradas en el código)
Sebastian Wramba
1
¿Es una categoría simple de fastidio que aplicará relleno para todos los campos de texto en la aplicación?
Ben Sinclair
@Andy no, solo se aplica cuando lo importas, deberás crear una clase UITextField + Padding e importarlo en el controlador de vista o en la clase en la que tienes un campo de texto con relleno
Mongi Zaidi
@MongiZaidi: estás equivocado. Se vincula al ejecutable, ya sea que importarlo sea irrelevante.
Zsolt Szatmari
1
textField.layer.borderWidth = 3;

agregará borde, que funcionó como relleno para mí.

Saqib Saud
fuente
0

Otra consideración es que, si tiene más de uno UITextFielddonde está agregando relleno, es crear un campo separado UIViewpara cada campo de texto, porque no se pueden compartir.

usuario1686700
fuente