2017-02-07 13 views
4

Я могу добавить кнопку в текстовое поле в правой части UITextField, используя правый вид, однако текст перекрывается на кнопке , Ниже приведен код для кнопки с правым углом зренияДобавить кнопку в правом представлении UItextfield таким образом, что текст не должен перекрывать кнопку

 UIView.commitAnimations() 
     var btnColor = UIButton(type: .Custom) 
     btnColor.addTarget(self, action: #selector(self.openEmoji), forControlEvents: .TouchUpInside) 
     btnColor.frame = CGRect(x: CGFloat(textField.frame.size.width - 25), y: CGFloat(5), width: CGFloat(25), height: CGFloat(25)) 
     btnColor.setBackgroundImage(UIImage(named: "send.png"), forState: .Normal) 
     textField.addSubview(btnColor) 

Пожалуйста, дайте мне знать, как дать прописку из правильного представления для текста.

ответ

12

использовать rightView свойство UITextField. В принципе, есть два свойства (соответственно это и LeftView), которые позволяют размещать пользовательские представления/элементы управления внутри UITextField. Вы можете контролировать, отображаются ли эти взгляды или нет с помощью rightViewMode/leftViewMode свойства:

textField.rightView = btnColor 
textField.rightViewMode = .unlessEditing 

для например

let button = UIButton(type: .custom) 
button.setImage(UIImage(named: "send.png"), for: .normal) 
button.imageEdgeInsets = UIEdgeInsetsMake(0, -16, 0, 0) 
button.frame = CGRect(x: CGFloat(txt.frame.size.width - 25), y: CGFloat(5), width: CGFloat(25), height: CGFloat(25)) 
button.addTarget(self, action: #selector(self.refresh), for: .touchUpInside) 
textField.rightView = button 
textField.rightViewMode = .always 

и называющих действие как

@IBAction func refresh(_ sender: Any) { 
} 
+0

Спасибо Все .. Его работает. Я приму ответ. Может ли кто-нибудь сказать мне, как дать пробел после изображения из левого представления для текста? – Saty

+0

@Saty - не похоже на то, что он зависит от пользователя –

+0

@ Anbu.Karthik Как есть изображение в левом представлении, поэтому я хочу иметь некоторое пространство после изображения, поэтому должен быть некоторый промежуток между изображением левого глаза и текстом – Saty

2

вы можете назначить кнопку при правильном представлении текстового поля

var btnColor = UIButton(type: .Custom) 
      btnColor.addTarget(self, action: #selector(self.openEmoji), forControlEvents: .TouchUpInside) 
      btnColor.frame = CGRect(x: CGFloat(textField.frame.size.width - 25), y: CGFloat(5), width: CGFloat(25), height: CGFloat(25)) 
      btnColor.setBackgroundImage(UIImage(named: "send.png"), forState: .Normal) 
      textField.rightView = btnColor 
3

Создайте расширение UITextField и добавьте метод ниже, и вы можете изменить код UIButton в соответствии с вашим требованием.

func setRightViewIcon(icon: UIImage) { 
    let btnView = UIButton(frame: CGRect(x: 0, y: 0, width: ((self.frame.height) * 0.70), height: ((self.frame.height) * 0.70))) 
    btnView.setImage(icon, for: .normal) 
    btnView.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 3) 
    self.rightViewMode = .always 
    self.rightView = btnView 
} 
0
internal var btnDropDown: UIButton { 
    let size: CGFloat = 25.0 
    let button = UIButton(type: .custom) 
    button.setImage(#imageLiteral(resourceName: "DropDownImage"), for: .normal) 
    button.imageEdgeInsets = UIEdgeInsetsMake(0, -(size/2.0), 0, 0) 
    button.frame = CGRect(x: self.frame.size.width - size, y: 0.0, width: size, height: size) 
    return button 
} 

И я использовал его как этот:

override func awakeFromNib() { 
    super.awakeFromNib() 
    textField.rightView = self.btnDropDown 
    textField.rightViewMode = .always 
} 
0

Правильный ответ Swift3 +

Если вы просто переопределить методы, текст может перекрывать правильный вид. Этот код полностью решает эту проблему.

Вы UITextField подкласс:

//... 

private func setInsets(forBounds bounds: CGRect) -> CGRect { 

    var totalInsets = insets //property in you subClass 

    if let leftView = leftView { totalInsets.left += leftView.frame.origin.x } 
    if let rightView = rightView { totalInsets.right += rightView.bounds.size.width } 

    return UIEdgeInsetsInsetRect(bounds, totalInsets) 
} 

override func textRect(forBounds bounds: CGRect) -> CGRect { 
    return setInsets(forBounds: bounds) 
} 

override func placeholderRect(forBounds bounds: CGRect) -> CGRect { 
    return setInsets(forBounds: bounds) 
} 

override func editingRect(forBounds bounds: CGRect) -> CGRect { 
    return setInsets(forBounds: bounds) 
} 

override func rightViewRect(forBounds bounds: CGRect) -> CGRect { 

    var rect = super.rightViewRect(forBounds: bounds) 
    rect.origin.x -= insets.right 

    return rect 
} 

override func leftViewRect(forBounds bounds: CGRect) -> CGRect { 

    var rect = super.leftViewRect(forBounds: bounds) 
    rect.origin.x += insets.left 

    return rect 
}