¿Cómo agrego relleno a un UITextField con un ícono?

Actualmente tengo el siguiente código para configurar un campo de text de contraseña:

self.passwordTextField = [UITextField new]; self.passwordTextField.placeholder = @"Password"; self.passwordTextField.font = [UIFont systemFontOfSize:18.f]; self.passwordTextField.secureTextEntry = YES; self.passwordTextField.returnKeyType = UIReturnKeyDone; self.passwordTextField.delegate = self; self.passwordTextField.backgroundColor = [UIColor colorWithRed:255 green:255 blue:255 alpha:0.64]; self.passwordTextField.layer.borderColor = [[UIColor lightGrayColor] CGColor]; self.passwordTextField.layer.borderWidth = 1.0f; CGFloat textFieldHeight = 45.f; CGFloat textFieldWidth = 300.f; self.passwordTextField.frame = CGRectMake(DIALOG_VIEW_WIDTH/2.f - textFieldWidth / 2.f, 240.f, textFieldWidth, textFieldHeight); UIImageView *icon = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"text-input-icon-password-key.png"]]; icon.frame = CGRectMake(0, 0, 45.f, 45.f); icon.backgroundColor = [UIColor lightGrayColor]; self.passwordTextField.leftView = icon; self.passwordTextField.leftViewMode = UITextFieldViewModeAlways; [self.dialogView addSubview:self.passwordTextField]; 

que me da esto:

introduzca la descripción de la imagen aquí

Sin embargo, quiero agregar un relleno más transparente a la izquierda del text del marcador de position y a la derecha de la vista de la image que muestra el icono. ¿Alguna idea de cómo se puede hacer esto?


Actualización: gracias por las respuestas. Logré esto al final creando una UIView para todo el object con una UIImageView para el icono y un UITextField embedded en otra UIView para el text. El resultado fue el siguiente:

introduzca la descripción de la imagen aquí

" Actualización: gracias por las respuestas. Logré esto al final creando una UIView para todo el object con una UIImageView para el ícono y un UITextField embedded en otra UIView para el text " .

Podría haber seguido usando la propiedad leftView del UITextField como:

 UIView *vwContainer = [[UIView alloc] init]; [vwContainer setFrame:CGRectMake(0.0f, 0.0f, 50.0f, 45.0f)]; [vwContainer setBackgroundColor:[UIColor clearColor]]; UIImageView *icon = [[UIImageView alloc] init]; [icon setImage:[UIImage imageNamed:@"text-input-icon-password-key.png"]]; [icon setFrame:CGRectMake(0.0f, 0.0f, 45.0f, 45.0f)]; [icon setBackgroundColor:[UIColor lightGrayColor]]; [vwContainer addSubview:icon]; [self.passwordTextField setLeftView:vwContainer]; [self.passwordTextField setLeftViewMode:UITextFieldViewModeAlways]; 

Si desea un control total sobre el layout personalizado, debe subclass UITextField y anular tanto los leftViewRectForBounds: y placeholderRectForBounds: y. Luego puede devolver los frameworks para ambas áreas y, por lo tanto, especificar el relleno entre ellos.

Aquí hay una subclass UITextField que permite inserciones en el text izquierdo (icono), el text y el text del marcador de position. Estos son todos configurables en IB

 class UITextFieldWithInsets: UITextField { @IBInspectable var horizontalInset:CGFloat = 0 @IBInspectable var verticalInset:CGFloat = 0 @IBInspectable var leftViewHorizontalInset:CGFloat = 0 @IBInspectable var leftViewVerticalInset:CGFloat = 0 override func textRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds , horizontalInset , verticalInset) } override func editingRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds , horizontalInset + leftViewHorizontalInset + leftViewWidth, verticalInset) } override func placeholderRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds, horizontalInset + leftViewHorizontalInset + leftViewWidth, verticalInset) } override func leftViewRectForBounds(bounds: CGRect) -> CGRect { let verticalInsetForCentenetworking = (bounds.height - leftViewHeight) / 2 return CGRect(x: leftViewHorizontalInset, y: leftViewVerticalInset > 0 ? leftViewVerticalInset : verticalInsetForCentenetworking, width: leftViewWidth, height: leftViewHeight) } private var leftViewWidth : CGFloat { get { return leftView?.frame.width ?? 0 } } private var leftViewHeight : CGFloat { get { return leftView?.frame.width ?? 0 } } } 

Puede usar una image más amplia para el ícono con una columna transparente derecha.