2017-06-02 94 views
0

所以我已經在我的應用程序中實現了uitextfield,並將其正確的視圖設置爲觸發某個按鈕。如何禁用uitextField.rightView的編輯功能。

但是,每當我按下uitextfield的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

請務必將您的按鈕查看您添加文本字段到你的上海華後。在這種情況下,它將重疊文本字段並攔截輕敲手勢。

或者您可以簡單地將約束設置爲特定寬度或左側按鈕。