Введите правый UIImageView в UITextField

У меня есть целевое действие, которое, когда кнопка нажата, я проверяю 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];
}

Мой UITextField добавляется в представление в viewDidLoad следующим образом:

[self.view addSubview:_name];

Как мне сделать, чтобы RightView UIImageView появился?

Ответ 1

Вы уверены, что не пропустили фрейм UITextField? И вы устанавливаете rightViewMode?

Это пример, который я только что написал, кажется, работает нормально.

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

Вот изображение галочки как результат:

Right image view

Ответ 2

Вы должны установить rightViewMode для текстового поля, потому что значение по умолчанию для этого свойства UITextFieldViewModeNever.

поэтому вам нужно установить режим из следующего,

   UITextFieldViewModeWhileEditing,
   UITextFieldViewModeUnlessEditing,
   UITextFieldViewModeAlways

Ответ 3

Решение в Swift 3:

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

Ответ 4

Для Swift 3. Показать изображение перед текстом-заполнителем в 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
    }

Для вызова функции

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

enter image description here

Ответ 5

Если у вас есть два или более поля, попробуйте этот код! это работает для меня.

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;

Проверьте 2 вещи

  1. txtField.rightViewMode = UITextFieldViewModeAlways
  2. Отдельный imageView для каждого textField

Ответ 6

Решение с @IBDesignable и Swift 3

Во-первых, вы можете создать @IBDesignable для UITextField следующим образом.

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

    }

Примечание: Вы должны написать и получить и установить точки для блока @IBInspactable потому что Swift предупредил о применении геттера и сеттера вместе. Нам не нужно использовать оператор get, поэтому вернулась пустая строка. Также имя атрибута включает в себя кнопку, но не путать, это ошибка.

Затем щелкните UITextField на StoryBoard и присвойте специальное имя изображения атрибуту setAButtonImageName.

enter image description here

Тогда вы получите следующий результат

enter image description here

Другая ситуация - это создание RightView с правым полем.

Вот скриншот.

enter image description here

Вы можете использовать UIView качестве контейнера, чем можете добавить UIImageView в этот UIView. Здесь вы должны вычислить правое поле, ширину контейнера и ширину UIImageViews.

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