代码之家  ›  专栏  ›  技术社区  ›  Enamul Haque

在Swift 4的左/右UITextField中添加图标或图像

  •  3
  • Enamul Haque  · 技术社区  · 6 年前

    我已经在中设置了左图标 UITextField . 当我设置文本时,它在左侧图标的上方。我想在 输入框 . 我使用了下面的代码。

        let imageView = UIImageView(image: UIImage(named: strImgname))
        imageView.frame = CGRect(x: 0, y: 0, 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
    
    2 回复  |  直到 6 年前
        1
  •  5
  •   Rizwan    6 年前

    你可以用 @IBDesignable 使可设计 UITextField 有了这些能力,甚至更多,并在整个项目中使用它。

    当图标位于 输入框 点击:

    import Foundation
    import UIKit
    
    protocol DesignableTextFieldDelegate: UITextFieldDelegate {
        func textFieldIconClicked(btn:UIButton)
    }
    
    @IBDesignable
    class DesignableTextField: UITextField {
    
        //Delegate when image/icon is tapped.
        private var myDelegate: DesignableTextFieldDelegate? {
            get { return delegate as? DesignableTextFieldDelegate }
        }
    
        @objc func buttonClicked(btn: UIButton){
            self.myDelegate?.textFieldIconClicked(btn: btn)
        }
    
        //Padding images on left
        override func leftViewRect(forBounds bounds: CGRect) -> CGRect {
            var textRect = super.leftViewRect(forBounds: bounds)
            textRect.origin.x += padding
            return textRect
        }
    
        //Padding images on Right
        override func rightViewRect(forBounds bounds: CGRect) -> CGRect {
            var textRect = super.rightViewRect(forBounds: bounds)
            textRect.origin.x -= padding
            return textRect
        }
    
        @IBInspectable var padding: CGFloat = 0
        @IBInspectable var leadingImage: UIImage? { didSet { updateView() }}
        @IBInspectable var color: UIColor = UIColor.lightGray { didSet { updateView() }}
        @IBInspectable var imageColor: UIColor = UIColor.init(hex: "3EB2FF") { didSet { updateView() }}
        @IBInspectable var rtl: Bool = false { didSet { updateView() }}
    
        func updateView() {
            rightViewMode = UITextFieldViewMode.never
            rightView = nil
            leftViewMode = UITextFieldViewMode.never
            leftView = nil
    
            if let image = leadingImage {
                let button = UIButton(type: .custom)
                button.frame = CGRect(x: 0, y: 0, width: 20, height: 20)
    
                let tintedImage = image.withRenderingMode(.alwaysTemplate)
                button.setImage(tintedImage, for: .normal)
                button.tintColor = imageColor
    
                button.setTitleColor(UIColor.clear, for: .normal)
                button.addTarget(self, action: #selector(buttonClicked(btn:)), for: UIControlEvents.touchDown)
                button.isUserInteractionEnabled = true
    
                if rtl {
                    rightViewMode = UITextFieldViewMode.always
                    rightView = button
                } else {
                    leftViewMode = UITextFieldViewMode.always
                    leftView = button
                }
            }
    
            // Placeholder text color
            attributedPlaceholder = NSAttributedString(string: placeholder != nil ?  placeholder! : "", attributes:[NSAttributedStringKey.foregroundColor: color])
        }
    }
    

    现在它在故事板中的设计如下:

    enter image description here 注: Rtl 设置为时 Off 图标将移动到 输入框

    在所需的ViewController中协调委托。

    class MyViewController: UIViewController, DesignableTextFieldDelegate {
        @IBOutlet weak var txtFieldSomeSearch: DesignableTextField!
        txtFieldSomeSearch.delegate = self // can be done in storyboard as well
        ... // other codes
        func textFieldIconClicked(btn: UIButton) {
            print("MyViewController : textFieldIconClicked")
        }
        ... // other codes
    }
    

    最终输出:

    enter image description here

        2
  •  2
  •   Midhun    6 年前
    please use below code
    
    // image on left side
    textField.leftViewMode = UITextFieldViewMode.Always
    let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
    let image = UIImage(named: imageName)
    imageView.image = image
    textField.leftView = imageView
    
    
    // image on left side
    textField.rightViewMode = UITextFieldViewMode.Always
    let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
    let image = UIImage(named: imageName)
    imageView.image = image
    textField.rightView = imageView