2013-10-08 15 views
11

ho un'azione di destinazione che, quando si preme un pulsante, a convalidare le UITextFields:Immettere un UIImageView rightview ad un UITextField

// Get the text from the UITextField 
NSString *nameStr = _name.text; 

_name.rightView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"error.png"]]; 
[self.view addSubview:_name]; 

if (nameStr.length == 0) 
{ 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Invalid Name" 
                message:@"You must enter a name." 
               delegate:nil 
              cancelButtonTitle:@"OK" 
              otherButtonTitles:nil]; 
    [alert show]; 
} 

miei UITextFields sono aggiunti alla vista in viewDidLoad in questo modo:

[self.view addSubview:_name]; 

Come si visualizza una vista a destra UIImageView?

risposta

23

Sei sicuro di non perdere il frame UITextField? E stai impostando il rightViewMode?

Questo è un esempio che ho appena scritto sembra funzionare bene.

UITextField *rightField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 140, 50)]; 
rightField.backgroundColor = [UIColor redColor]; // For testing purpose 
rightField.rightViewMode = UITextFieldViewModeAlways;// Set rightview mode 

UIImageView *rightImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Tick_white_color"]]; 
rightField.rightView = rightImageView; // Set right view as image view 

[self.view addSubview:rightField]; 

Qui è l'immagine segno di spunta come risultato: Right image view

24

È necessario impostare rightViewMode della Textfield perché il valore predefinito per questa proprietà è UITextFieldViewModeNever.

modo da avere per impostare la modalità di seguire,

UITextFieldViewModeWhileEditing, 
    UITextFieldViewModeUnlessEditing, 
    UITextFieldViewModeAlways 
3

Soluzione in Swift 3:

class CustomText: UITextField { 
    @IBInspectable var rightImage : UIImage?{ 
     didSet{ 
      self.rightView = UIImageView(image: rightImage) 
      // select mode -> .never .whileEditing .unlessEditing .always 
      self.rightViewMode = .always 
     } 
    } 
} 
3

immagine Esposizione Swift 3.To In prima testo segnaposto in UITextField

func setPaddingView(strImgname: String,txtField: UITextField){ 
     let imageView = UIImageView(image: UIImage(named: strImgname)) 
     imageView.frame = CGRect(x: 0, y: 5, width: imageView.image!.size.width , height: imageView.image!.size.height) 
     let paddingView: UIView = UIView.init(frame: CGRect(x: 0, y: 0, width: 50, height: 30)) 
     paddingView.addSubview(imageView) 
     txtField.leftViewMode = .always 
     txtField.leftView = paddingView 
    } 

Per chiamata di funzione

self.setPaddingView(strImgname: "mail", txtField: txtEmail) 

enter image description here

0

Se si dispone di due o più campo quindi provare questo codice! sta funzionando per me.

dropDownImageViewForTextField1 = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)]; 
    dropDownImageViewForTextField1.image = [UIImage imageNamed:@"dropdown_n_icon.png"]; 

    dropDownImageViewForTextField2 = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)]; 
    dropDownImageViewForTextField2.image = [UIImage imageNamed:@"dropdown_n_icon.png"]; 


    txtField1.rightViewMode = UITextFieldViewModeAlways; 
    txtField1.rightView = dropDownImageViewForTextField1; 

    txtField2.rightViewMode = UITextFieldViewModeAlways; 
    txtField2.rightView = dropDownImageViewForTextField2; 

Fare il check-2 cose

  1. TxtField.rightViewMode = UITextFieldViewModeAlways
  2. IMAGEVIEW separata per ogni campo di testo
0

Soluzione con @IBDesignable e Swift 3

In primo luogo, è possibile creare @IBDesignable per UITextField come questo.

@IBDesignable extension UITextField{ 

    @IBInspectable var setImageName: String { 
      get{ 
       return "" 
      } 
      set{ 
       let imageView: UIImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 20, height: 20)) 
       imageView.image = UIImage(named: newValue)! 
       self.rightView = imageView 
       self.rightViewMode = UITextFieldViewMode.always 
     } 

    } 

Nota: Devi essere scrivere ottenere e impostare punti per @IBInspactable blocco perché Swift deve mettere in guardia da applicare getter e setter insieme. Non abbiamo bisogno di usare l'istruzione get, quindi ho restituito una stringa vuota. Anche il nome dell'attributo include Button, ma non confondere, è un errore.

Quindi fare clic sul UITextField su Storyboard e dare il nome dell'immagine spesific al setAButtonImageName dell'attributo .

enter image description here

allora si otterrà il seguente risultato

enter image description here

L'altra situazione è il rightView creare con sembra ha margine destro

Ecco lo screenshot.

enter image description here

È possibile utilizzare un UIView come contenitore che può aggiungere l'UIImageView in questo UIView. Qui è necessario calcolare il margine destro , la vista del contenitore è larghezza e UIImageViews 'larghezza.

@IBInspectable var setImageName: String { 
     get{ 
      return "" 
     } 
     set{ 
      let containerView: UIView = UIView(frame: CGRect(x: 0, y: 0, width:50, height: self.frame.height)) 
      let imageView: UIImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 20, height: 20)) 
      imageView.image = UIImage(named: newValue)! 
      containerView.addSubview(imageView) 
      imageView.center = containerView.center 
      self.rightView = containerView 
      self.rightViewMode = UITextFieldViewMode.always 
     } 
    }