Swift在UITextField中添加图标/图像

inf*_*ker 88 login image uitextfield ios swift

我想在UITextField中添加图标/图像.图标/图像应留给占位符.

在此输入图像描述

我试过这个:

var imageView = UIImageView();
var image = UIImage(named: "email.png");
imageView.image = image;
emailField.leftView = imageView;
Run Code Online (Sandbox Code Playgroud)

谢谢.

Mar*_*ens 117

Sahil有一个很好的答案,我希望将其扩展为@IBDesignable,以便开发人员可以在故事板上的UITextFields中添加图像.

Swift 4.2

import UIKit

@IBDesignable
class DesignableUITextField: UITextField {

    // Provides left padding for images
    override func leftViewRect(forBounds bounds: CGRect) -> CGRect {
        var textRect = super.leftViewRect(forBounds: bounds)
        textRect.origin.x += leftPadding
        return textRect
    }

    @IBInspectable var leftImage: UIImage? {
        didSet {
            updateView()
        }
    }

    @IBInspectable var leftPadding: CGFloat = 0

    @IBInspectable var color: UIColor = UIColor.lightGray {
        didSet {
            updateView()
        }
    }

    func updateView() {
        if let image = leftImage {
            leftViewMode = UITextField.ViewMode.always
            let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
            imageView.contentMode = .scaleAspectFit
            imageView.image = image
            // Note: In order for your image to use the tint color, you have to select the image in the Assets.xcassets and change the "Render As" property to "Template Image".
            imageView.tintColor = color
            leftView = imageView
        } else {
            leftViewMode = UITextField.ViewMode.never
            leftView = nil
        }

        // Placeholder text color
        attributedPlaceholder = NSAttributedString(string: placeholder != nil ?  placeholder! : "", attributes:[NSAttributedString.Key.foregroundColor: color])
    }
}
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

这个可设计允许您:

  • 在左侧设置图像
  • 在UITextField的左边缘和图像之间添加填充
  • 设置颜色,使图像和占位符文本匹配

笔记

  • 要更改图像颜色,您必须在代码中的注释中遵循该注释
  • 故事板中的图像颜色不会改变.您必须运行项目才能在模拟器/设备中查看颜色.

可在故事板中设计 故事板

在运行时 运行

  • 那么图像和文本之间的填充呢? (14认同)
  • 在imageView.contentMode = .AspectFit中添加,以避免图像大小调整. (5认同)
  • 非常感谢您的精彩帖子!我已经对其进行了修改,使其也具有RTL选项。此处提供代码:http://pastebin.com/7CCm6NEB (2认同)

Mar*_*kus 100

尝试添加 emailField.leftViewMode = UITextFieldViewMode.Always

(默认leftViewModeNever)

更新了Swift 4的答案

emailField.leftViewMode = UITextFieldViewMode.always

emailField.leftViewMode = .always
Run Code Online (Sandbox Code Playgroud)

  • 我继续我的搜索,最后让它工作,我错过了为图像视图设置框架.看起来我们需要在将图像添加到uitextfield之前在图像上设置框架.像这样的`imageView1.frame = CGRect(x:5,y:0,width:userName.frame.height,height:userName.frame.height)view.addSubview(imageView1) (5认同)
  • 对了谢谢.问题是图标是白色的,在白色背景上看不到. (4认同)

Sah*_*hil 48

我只想在这里添加更多内容:

如果要UITextField在左侧添加图像使用leftView属性UITextField

注意: 不要忘记设置leftViewModeUITextFieldViewMode.Always和右rightViewModeUITextFieldViewMode.Always and默认是UITextFieldViewModeNever

例如

用于在左侧添加图像

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
Run Code Online (Sandbox Code Playgroud)

用于在右侧添加图像

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
Run Code Online (Sandbox Code Playgroud)

注意:UITextField在左侧或右侧添加图像时需要注意的一些事项.

  • 不要忘记给出一个ImageView你要添加的框架UITextField

    让imageView = UIImageView(框架:CGRect(x:0,y:0,宽度:20,高度:20))

  • 如果您的图像背景为白色,则图像将不可见 UITextField

  • 如果要将图像添加到需要添加ImageView为子视图的特定位置UITextField.

更新Swift 3.0

@Mark Moeykens精美地消耗它并使其成为@IBDesignable.

我在这里修改并添加了一些功能(为右图添加底线和填充).

注意如果要在右侧添加图像,可以在界面构建器中选择该Force Right-to-Left选项semantic(但是,在覆盖rightViewRect方法之前,右图像填充将不起作用).

在此输入图像描述

我修改了这个,可以从这里下载源ImageTextField

在此输入图像描述


Ins*_*sou 17

带图像的UITextField(左或右)

另一种方式,灵感来自以前的帖子,以进行扩展.

我们可以将图像放在右侧或左侧

extension UITextField {

enum Direction {
    case Left
    case Right
}

// add image to textfield
func withImage(direction: Direction, image: UIImage, colorSeparator: UIColor, colorBorder: UIColor){
    let mainView = UIView(frame: CGRect(x: 0, y: 0, width: 50, height: 45))
    mainView.layer.cornerRadius = 5

    let view = UIView(frame: CGRect(x: 0, y: 0, width: 50, height: 45))
    view.backgroundColor = .white
    view.clipsToBounds = true
    view.layer.cornerRadius = 5
    view.layer.borderWidth = CGFloat(0.5)
    view.layer.borderColor = colorBorder.cgColor
    mainView.addSubview(view)

    let imageView = UIImageView(image: image)
    imageView.contentMode = .scaleAspectFit
    imageView.frame = CGRect(x: 12.0, y: 10.0, width: 24.0, height: 24.0)
    view.addSubview(imageView)

    let seperatorView = UIView()
    seperatorView.backgroundColor = colorSeparator
    mainView.addSubview(seperatorView)

    if(Direction.Left == direction){ // image left
        seperatorView.frame = CGRect(x: 45, y: 0, width: 5, height: 45)
        self.leftViewMode = .always
        self.leftView = mainView
    } else { // image right
        seperatorView.frame = CGRect(x: 0, y: 0, width: 5, height: 45)
        self.rightViewMode = .always
        self.rightView = mainView
    }

    self.layer.borderColor = colorBorder.cgColor
    self.layer.borderWidth = CGFloat(0.5)
    self.layer.cornerRadius = 5
}

}
Run Code Online (Sandbox Code Playgroud)

使用 :

if let myImage = UIImage(named: "my_image"){
    textfield.withImage(direction: .Left, image: myImage, colorSeparator: UIColor.orange, colorBorder: UIColor.black)
}
Run Code Online (Sandbox Code Playgroud)

请享用 :)

  • 你创造了我的一天,我自定义了“view.backgroundColor”和“imageView.tintColor”以使其完全可定制。非常感谢您的回答 xD (2认同)
  • 这太棒了 (2认同)
  • 这是最好且简单的答案 (2认同)

Mau*_*tel 11

对于Swift 3.0,在textField的左侧添加图像

textField.leftView = UIImageView(image: "small-calendar")
textField.leftView?.frame = CGRect(x: 0, y: 5, width: 20 , height:20)
textField.leftViewMode = .always
Run Code Online (Sandbox Code Playgroud)


小智 9

为了创建填充,我喜欢将图像放置在容器视图内。对图标放置满意后,可以删除背景色。

在此处输入图片说明

let imageView = UIImageView(frame: CGRect(x: 8.0, y: 8.0, width: 24.0, height: 24.0))
let image = UIImage(named: "my_icon")
imageView.image = image
imageView.contentMode = .scaleAspectFit
imageView.backgroundColor = UIColor.red

let view = UIView(frame: CGRect(x: 0, y: 0, width: 32, height: 40))
view.addSubview(imageView)
view.backgroundColor = .green
textField.leftViewMode = UITextFieldViewMode.always
textField.leftView = view
Run Code Online (Sandbox Code Playgroud)


Gur*_*ngh 8

斯威夫特 5

@IBOutlet weak var paswd: UITextField! {
    didSet{
      paswd.setLeftView(image: UIImage.init(named: "password")!)
      paswd.tintColor = .darkGray
      paswd.isSecureTextEntry = true
    }   
 }
Run Code Online (Sandbox Code Playgroud)

我已经创建了扩展

extension UITextField {
  func setLeftView(image: UIImage) {
    let iconView = UIImageView(frame: CGRect(x: 10, y: 10, width: 25, height: 25)) // set your Own size
    iconView.image = image
    let iconContainerView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: 35, height: 45))
    iconContainerView.addSubview(iconView)
    leftView = iconContainerView
    leftViewMode = .always
    self.tintColor = .lightGray
  }
}
Run Code Online (Sandbox Code Playgroud)

结果

在此处输入图片说明


Fat*_*tie 7

2020 - 合理的解决方案

关于苹果的这种疯狂。

这可能是“最清晰”、最简单的方法:

在此处输入图片说明

首先,您必须正确移动文本。

注意这个关键的 QA:https : //stackoverflow.com/a/27066764/294884

class TidyTextField: UITextField {
    
    @IBInspectable var leftImage: UIImage? = nil
    @IBInspectable var leftPadding: CGFloat = 0
    @IBInspectable var gapPadding: CGFloat = 0
    
    private var textPadding: UIEdgeInsets {
        let p: CGFloat = leftPadding + gapPadding + (leftView?.frame.width ?? 0)
        return UIEdgeInsets(top: 0, left: p, bottom: 0, right: 5)
    }
    
    override open func textRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: textPadding)
    }
    
    override open func placeholderRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: textPadding)
    }
    
    override open func editingRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: textPadding)
    }
    
Run Code Online (Sandbox Code Playgroud)

继续,我们现在必须制作并移动左图:

    override func leftViewRect(forBounds bounds: CGRect) -> CGRect {
        var r = super.leftViewRect(forBounds: bounds)
        r.origin.x += leftPadding
        return r
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        setup()
    }
    
    private func setup() {
        if let image = leftImage {
            if leftView != nil { return } // critical!
            
            let im = UIImageView()
            im.contentMode = .scaleAspectFit
            im.image = image
            
            leftViewMode = UITextField.ViewMode.always
            leftView = im
            
        } else {
            leftViewMode = UITextField.ViewMode.never
            leftView = nil
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这似乎是最清晰、最可靠的方法。


Ash*_*hra 7

使用 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
     }

  }
Run Code Online (Sandbox Code Playgroud)

使用代码作为左图像设置:-

   self.password_text_field.setupLeftImage(imageName: "unlock")
Run Code Online (Sandbox Code Playgroud)

输出 :)

在此输入图像描述