Establecer relleno para UITextField con UITextBorderStyleNone

Resuelto Sebastian Wramba asked hace 54 años • 32 respuestas

Quería usar un fondo personalizado para mi UITextFields. Esto funciona bien excepto por el hecho de que tengo que usarlo 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 UITextBorderStyleRoundedRectexcepto por usar mi imagen de fondo personalizada?

Sebastian Wramba avatar Jan 01 '70 08:01 Sebastian Wramba
Aceptado

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

Básicamente, configura la propiedad leftView para que UITextFieldsea 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ó de maravilla 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
Evil Trout avatar Dec 12 '2010 20:12 Evil Trout

Creé la implementación de esta 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 proporcionado por Piotr Blasiak. Parecía más simple que crear una subclase completamente nueva, y también más simple que agregar el archivo UIView. Aún así, parece que falta algo para no poder controlar el relleno dentro de un campo de texto.

Solución rápida 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 avatar Jun 20 '2011 19:06 Nate Flink

Una versión de Swift 3 para Xcode >6, donde puede editar el valor insertado 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 avatar Dec 18 '2014 18:12 bandejapaisa

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 campos de texto alineados a la derecha, utilice CATransform3DMakeTranslation(-5, 0, 0)la mención de latenitacoder en los comentarios.

Inder Kumar Rathore avatar May 27 '2014 10:05 Inder Kumar Rathore