简体   繁体   English

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

[英]Add icon or image in UITextField on left / right in Swift 4

I have set up the left icon in UITextField .我已经在UITextField设置了左图标。 When I set text, it is over the left icon.当我设置文本时,它位于左侧图标上方。 I want to set text after the icon in the UITextField .我想在UITextField的图标之后设置文本。 I have used below code.我使用了下面的代码。

    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

You can use @IBDesignable to make a designable UITextField with these capabilities and even more and use it through out your project.您可以使用@IBDesignable来制作具有这些功能甚至更多功能的可设计UITextField ,并在整个项目中使用它。

DesignableTextField with Delegate methods when icon in UITextField is tapped:UITextField中的图标被点击时,带有 Delegate 方法的 DesignableTextField:

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])
    }
}

Now its Designable in the Storyboard as follows:现在它在故事板中的可设计性如下:

在此处输入图片说明 NOTE: Rtl when set to Off icon will move to left of UITextField注意: Rtl当设置为Off图标时会移动到UITextField左边

Conforming the Delegate in desired ViewController.在所需的 ViewController 中符合 Delegate。

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
}

Finally Output :最后输出:

在此处输入图片说明

Using the extension in Swift4 , We can easily put the image on the right or on the left with padding to TextField.使用Swift4 中的扩展,我们可以轻松地将图像放在右侧或左侧,并填充到 TextField。

extension UITextField {

    //MARK:- Set Image on the right of text fields

  func setupRightImage(imageName:String){
    let imageView = UIImageView(frame: CGRect(x: 10, y: 10, width: 20, height: 20))
    imageView.image = UIImage(named: imageName)
    let imageContainerView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: 55, height: 40))
    imageContainerView.addSubview(imageView)
    rightView = imageContainerView
    rightViewMode = .always
    self.tintColor = .lightGray
}

 //MARK:- Set Image on left of text fields

    func setupLeftImage(imageName:String){
       let imageView = UIImageView(frame: CGRect(x: 10, y: 10, width: 20, height: 20))
       imageView.image = UIImage(named: imageName)
       let imageContainerView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: 55, height: 40))
       imageContainerView.addSubview(imageView)
       leftView = imageContainerView
       leftViewMode = .always
       self.tintColor = .lightGray
     }

  }

Use code as for right image setup:-使用代码作为正确的图像设置:-

self.password_text_field.setupRightImage(imageName: "unlock")

Output :)输出 :)

在此处输入图片说明

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

Extension to UITextField in Swift 5. This allows you to check if the image is a system image, otherwise, you use a custom image. Swift 5 中UITextField扩展。这允许您检查图像是否为系统图像,否则,您使用自定义图像。 You can also set which side of the text field you want the image on using the TextFieldImageSide enumeration.您还可以使用TextFieldImageSide枚举设置您希望图像显示在文本字段的哪一侧。

enum TextFieldImageSide {
    case left
    case right
}

extension UITextField {
    func setUpImage(imageName: String, on side: TextFieldImageSide) {
        let imageView = UIImageView(frame: CGRect(x: 10, y: 5, width: 30, height: 30))
        if let imageWithSystemName = UIImage(systemName: imageName) {
            imageView.image = imageWithSystemName
        } else {
            imageView.image = UIImage(named: imageName)
        }
        
        let imageContainerView = UIView(frame: CGRect(x: 0, y: 0, width: 45, height: 40))
        imageContainerView.addSubview(imageView)
        
        switch side {
        case .left:
            leftView = imageContainerView
            leftViewMode = .always
        case .right:
            rightView = imageContainerView
            rightViewMode = .always
        }
    }
}

Usage:用法:

searchBar.setUpImage(imageName: "mappin.and.ellipse", on: .left)

Produces the following:产生以下内容: 在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM