2017-06-02 20 views
0

私は自分のアプリケーションでuitextフィールドを実装し、何かをトリガするボタンになるように右のビューを設定しています。uitextField.rightViewの編集機能を無効にする方法。

しかし、私はuitextフィールドのrightViewを押すたびに、それはまた、編集を開始する(キーボードが表示されます)アプリを起動します。

uitextFieldのrightViewを押したときの編集を無効にするにはどうすればよいですか?

ありがとうございました。

+0

右ボタンの内側にこの行を書く[self.view endEditing:YES]; –

+0

あなたの試したコードを表示 –

答えて

1

使用このカスタムサブクラス:

@IBDesignable class TJTextField: UITextField { 

    fileprivate var ImgIcon: UIImageView? 

    @IBInspectable var errorEntry: Bool = false { 
     didSet { 
      self.setNeedsDisplay() 
     } 
    } 
    @IBInspectable var leftTextPedding: Int = 0 { 
     didSet { 
      self.setNeedsDisplay() 
     } 
    } 
    @IBInspectable var lineColor: UIColor = UIColor.black { 
     didSet { 
      self.setNeedsDisplay() 
     } 
    } 
    @IBInspectable var placeHolerColor: UIColor = UIColor(red: 199.0/255.0, green: 199.0/255.0, blue: 205.0/255.0, alpha: 1.0) { 
     didSet { 
      self.setNeedsDisplay() 
     } 
    } 
    @IBInspectable var errorColor: UIColor = UIColor.red { 
     didSet { 
      self.setNeedsDisplay() 
     } 
    } 

    @IBInspectable var imageWidth: Int = 0 { 
     didSet { 
      self.setNeedsDisplay() 
     } 
    } 
    @IBInspectable var txtImage : UIImage? { 
     didSet { 
      self.setNeedsDisplay() 
     } 
    } 
    override func textRect(forBounds bounds: CGRect) -> CGRect { 
     return self.newBounds(bounds) 
    } 
    override func editingRect(forBounds bounds: CGRect) -> CGRect { 
     return self.newBounds(bounds) 
    } 

    fileprivate func newBounds(_ bounds: CGRect) -> CGRect { 

     var newBounds = bounds 
     newBounds.origin.x += CGFloat(leftTextPedding) + CGFloat(imageWidth) 
     return newBounds 
    } 

    var errorMessage: String? 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     //setting left image 
     if (txtImage != nil) 
     { 
      let btnLeft = UIButton() 

      btnLeft.frame = CGRect(x: 0, y: 0, width: CGFloat(imageWidth), height: self.frame.height) 
      btnLeft.setImage(txtImage, for: .normal) 
      self.leftViewMode = UITextFieldViewMode.always 
      self.leftView = btnLeft 
      btnLeft.addTarget(self, action: #selector(TJTextField.btnClicked), for: .touchUpInside) 
     } 
    } 
    func btnClicked() 
    { 
     if !self.isEditing 
     { 
      self.resignFirstResponder() 
     } 

    } 
    override func draw(_ rect: CGRect) 
    { 
     let height = self.bounds.height 

     // get the current drawing context 
     let context = UIGraphicsGetCurrentContext() 

     // set the line color and width 
     if errorEntry { 
      context?.setStrokeColor(errorColor.cgColor) 
      context?.setLineWidth(1.5) 
     } else { 
      context?.setStrokeColor(lineColor.cgColor) 
      context?.setLineWidth(0.5) 
     } 

     // start a new Path 
     context?.beginPath() 

     context!.move(to: CGPoint(x: self.bounds.origin.x, y: height - 0.5)) 
     context!.addLine(to: CGPoint(x: self.bounds.size.width, y: height - 0.5)) 
     // close and stroke (draw) it 
     context?.closePath() 
     context?.strokePath() 

     //Setting custom placeholder color 
     if let strPlaceHolder: String = self.placeholder 
     { 
      self.attributedPlaceholder = NSAttributedString(string:strPlaceHolder, 
       attributes:[NSForegroundColorAttributeName:placeHolerColor]) 
     } 
    } 
    override func leftViewRect(forBounds bounds: CGRect) -> CGRect 
    { 
     return CGRect(x: 0, y: 0, width: CGFloat(imageWidth), height: self.frame.height) 
    } 
} 
+0

なぜIBDEsignableとIBInspectableをここに配置する必要がありますか? –

+0

@TejaNandamuri UIButton、IBDEsignable、IBInspectableのサブクラスは、storybordでライブレンダリングします。 –

+0

@TejaNandamuri TJTextfieldをボタンのスーパークラスとして設定するだけで、すべての作業が完了します。 –

0

はあなたのスーパービューにテキストフィールドを追加した後、あなたのボタンの表示を追加してください。その場合、テキストフィールドとオーバーラップしてタップジェスチャを傍受します。

または、制約を特定の幅または左ボタン側に設定するだけでもかまいません。

関連する問題