Швидко додайте піктограму / зображення в UITextField


101

Я хотів би додати піктограму / зображення в UITextField. Піктограму / зображення слід залишити для заповнення.

введіть тут опис зображення

Я спробував це:

var imageView = UIImageView();
var image = UIImage(named: "email.png");
imageView.image = image;
emailField.leftView = imageView;

Дякую.


74
Ви випадково додали крапки з комою: D
Джеральд

10
emailField.leftView = UIImageView(image: UIImage(named: "search")):)
tspentzas

Використовуючи це, @IBDesignableми можемо зробити це елегантно, як у цьому прикладі: stackoverflow.com/a/51841433/8238512
Rizwan

Відповіді:


121

Спробуйте додати emailField.leftViewMode = UITextFieldViewMode.Always

(Типово leftViewMode- Never)

Оновлений відповідь для Swift 4

emailField.leftViewMode = UITextFieldViewMode.always

emailField.leftViewMode = .always

Хм, це працювало для мене, ви спробували це з оновленим значенням ( UITextFieldViewMode.Always)? Чи маєте ви уявлення про те, що це не працювало? (наприклад, це склав?)
Маркус

Це весь мій код у розділі "ViewWillAppear": 'var imageView = UIImageView (); var image = UIImage (названий: "email.png"); imageView.image = зображення; emailTextField.leftView = imageView; emailTextField.leftViewMode = UITextFieldViewMode.Aways
інформатор

@informatiker Добре, ви впевнені, що підключення правильні, якщо ви, наприклад, встановили колір тла emailTextField чи дійсно він змінюється? А ви впевнені, що зображення є? Наприклад, створіть інший UIImageView і завантажте його imageв той, щоб переконатися, що це працює.
Маркус

4
так дякую. Проблема полягала в тому, що піктограма біла і її не було видно на білому тлі.
інформатикер

5
Я продовжив пошук і, нарешті, змусив його працювати, я пропустив налаштування кадру для перегляду зображення. Подивіться, нам потрібно встановити кадр на зображення перед тим, як додати його до поля uitextfield. Щось подібнеimageView1.frame = CGRect(x: 5, y: 0, width: userName.frame.height, height: userName.frame.height) view.addSubview(imageView1)
Саші

123

У Sahil чудова відповідь, і я хотів взяти це і розширити його на @IBDesignable, щоб розробники могли додавати зображення до своїх UITextFields на аркуші розкадри.

Швидкий 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])
    }
}

Що тут відбувається?

Цей позначення дозволяє:

  • Встановіть зображення зліва
  • Додайте прокладку між лівим краєм UITextField та зображенням
  • Встановіть колір, щоб зображення та текст заповнювача збігалися

Примітки

  • Щоб змінити колір зображення, слід дотримуватися цієї примітки в коментарі до коду
  • Колір зображення не зміниться на Дошці розкадрувань. Вам потрібно запустити проект, щоб побачити колір у тренажері / пристрої.

Позначається у дошці розкадрувань Дошка розкадрувань

Під час виконання Час виконання


5
Додано в imageView.contentMode = .AspectFit, щоб уникнути зміни розміру зображення.
Jerland2

3
Велике спасибі за чудовий пост! Я змінив її, щоб вона також мала можливість RTL. Код доступний тут: pastebin.com/7CCm6NEB
Алі Алмохсен

Гарна робота, хлопці! Пізніше я теж зробив те саме. Ха-ха
Марк Мойкенс

14
як щодо прокладки між зображенням і текстом?
Запорожченко Олександр

1
велика відповідь.
Ріпа Саха

51

Я просто хочу тут додати ще щось:

Якщо ви хочете додати зображення UITextFieldзліва, використовуйте leftViewвластивістьUITextField

ПРИМІТКА. Не забудьте встановити leftViewModeзначення " UITextFieldViewMode.AlwaysПраво rightViewModeза UITextFieldViewMode.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

Для додавання зображення з правого боку

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

ПРИМІТКА. Деякі речі, про які потрібно подбати, додаючи зображення з 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

введіть тут опис зображення


як я можу додати це у розширеннях та зателефонувати у свій переглядач? Ви можете мені запропонувати
narahari_arjun

Дуже просто! просто створіть функцію в розширенні UIViewController та передайте ім'я зображення та текстове поле при виклику цієї функції.
Сахіль

розширення UIViewController {func addLeftImage (imageName: String, textField: UITextField) {textField.leftViewMode = UITextFieldViewMode.Всі дозвольте imageView = UIImageView (кадр: CGRect (x: 0, y: 0, ширина: 20, висота: 20, висота) 20, висота: 20, висота) = UIImage (названий: imageName) imageView.image = зображення textField.leftView = imageView}} і називати його як self.addLeftImage ("ім'янамене", textField: yourtextfield)
Sahil

я намагався змінити положення піктограми. але не змінено за допомогою цього коду
Рахул

22

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
}

}

Використання:

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

Насолоджуйтесь :)


1
Ви зробили мій день, я налаштував "view.backgroundColor" та "imageView.tintColor", щоб зробити його повністю настроюваним. Дякую за вашу відповідь xD
Андрес Паладінес,

1
Це приголомшливо
Мохамед Газель

1
Це найкращі та прості відповіді
Джерардо Салазар Санчес

14

Щоб створити набивання, мені подобається розміщувати зображення всередині виду контейнера. Ви можете видалити колір фону, як тільки будете задоволені розміщенням значка.

введіть тут опис зображення

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

Дякую. Гарне пояснення кольорами.
Хамід Реза Ансарі

13

для 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

6

Швидкий 5

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

Я створив розширення

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

Результат

введіть тут опис зображення


4

2020 рік - розумне рішення

Щодо цього божевілля від Apple.

Ось, мабуть, "найясніший", найпростіший спосіб зробити це:

введіть тут опис зображення

По-перше, ви повинні правильно перемістити текст.

Зверніть увагу на цей критичний 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)
    }
    

продовжуючи, тепер нам потрібно зробити і перемістити ліве зображення:

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

Це, мабуть, стосується найяснішого, найнадійнішого способу зробити це.


3

Я створив простий IBDesignable. Використовуйте його, як ні. Просто переконайтеся, що ваше UITextField підтверджує цей клас.

import UIKit

@IBDesignable
class RoundTextField : UITextField {
    @IBInspectable var cornerRadius : CGFloat = 0{
        didSet{
            layer.cornerRadius = cornerRadius
            layer.masksToBounds = cornerRadius > 0
        }
    }

    @IBInspectable var borderWidth : CGFloat = 0 {
        didSet{
            layer.borderWidth = borderWidth
        }
    }

    @IBInspectable var borderColor : UIColor? {
        didSet {
            layer.borderColor = borderColor?.cgColor
        }
    }

    @IBInspectable var bgColor : UIColor? {
        didSet {
            backgroundColor = bgColor
        }
    }

    @IBInspectable var leftImage : UIImage? {
        didSet {
            if let image = leftImage{
                leftViewMode = .always
                let imageView = UIImageView(frame: CGRect(x: 20, y: 0, width: 20, height: 20))
                imageView.image = image
                imageView.tintColor = tintColor
                let view = UIView(frame : CGRect(x: 0, y: 0, width: 25, height: 20))
                view.addSubview(imageView)
                leftView = view
            }else {
                leftViewMode = .never
            }

        }
    }

    @IBInspectable var placeholderColor : UIColor? {
        didSet {
            let rawString = attributedPlaceholder?.string != nil ? attributedPlaceholder!.string : ""
            let str = NSAttributedString(string: rawString, attributes: [NSForegroundColorAttributeName : placeholderColor!])
            attributedPlaceholder = str
        }
    }

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.insetBy(dx: 50, dy: 5)
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.insetBy(dx: 50, dy: 5)
    }

}

3

введіть тут опис зображення
Ще один спосіб встановити значок заповнювача та встановити прокладку для TextField.

let userIcon = UIImage(named: "ImageName") 
setPaddingWithImage(image: userIcon, textField: txtUsername)

func setPaddingWithImage(image: UIImage, textField: UITextField){
    let imageView = UIImageView(image: image)
    imageView.contentMode = .scaleAspectFit
    let view = UIView(frame: CGRect(x: 0, y: 0, width: 60, height: 50))
    imageView.frame = CGRect(x: 13.0, y: 13.0, width: 24.0, height: 24.0)
    //For Setting extra padding other than Icon.
    let seperatorView = UIView(frame: CGRect(x: 50, y: 0, width: 10, height: 50))
    seperatorview.backgroundColor = UIColor(red: 80/255, green: 89/255, blue: 94/255, alpha: 1)
    view.addSubview(seperatorView)
    textField.leftViewMode = .always
    view.addSubview(imageView)
    view.backgroundColor = .darkGray
    textField.leftViewMode = UITextFieldViewMode.always
    textField.leftView = view
}

2

Швидкий 3.1

extension UITextField
{
    enum Direction
    {
        case Left
        case Right
    }

    func AddImage(direction:Direction,imageName:String,Frame:CGRect,backgroundColor:UIColor)
    {
        let View = UIView(frame: Frame)
        View.backgroundColor = backgroundColor

        let imageView = UIImageView(frame: Frame)
        imageView.image = UIImage(named: imageName)

        View.addSubview(imageView)

        if Direction.Left == direction
        {
            self.leftViewMode = .always
            self.leftView = View
        }
        else
        {
            self.rightViewMode = .always
            self.rightView = View
        }
    }

}

будь-ласка, додайте ussage і що мені потрібно, щоб передати параметр кадру?
Сурія Редді

в цій функції "Параметр" Рамка Використання для лівого або правого
виду

1

Ви можете поставити цю функцію у свій глобальний файл або вище свого класу, щоб мати доступ до нього у всій програмі. Після цієї процедури ви можете зателефонувати на цю функцію відповідно до ваших вимог у програмі.

        func SetLeftSIDEImage(TextField: UITextField, ImageName: String){

                let leftImageView = UIImageView()
                leftImageView.contentMode = .scaleAspectFit

                let leftView = UIView()

                leftView.frame = CGRect(x: 20, y: 0, width: 30, height: 20)
                leftImageView.frame = CGRect(x: 13, y: 0, width: 15, height: 20)
                TextField.leftViewMode = .always
                TextField.leftView = leftView

                let image = UIImage(named: ImageName)?.withRenderingMode(.alwaysTemplate)
                leftImageView.image = image
                leftImageView.tintColor = UIColor(red: 106/255, green: 79/255, blue: 131/255, alpha: 1.0)
                leftImageView.tintColorDidChange()

                leftView.addSubview(leftImageView)
            }

            SetLeftSIDEImage(TextField: Your_textField, ImageName:YourImageName) // call function

2
Ласкаво просимо до StackOverflow, чи є якийсь спосіб ви могли б дати пояснення разом із цим кодом? Відповіді, які містять лише код, зазвичай видаляються за низьку якість. Також перегляньте цей посібник для відповідей у ​​розділі довідки: stackoverflow.com/help/how-to-answer
Грем

0

Чому б не піти на найпростіший підхід. У більшості випадків ви хочете додати піктограми, такі як шрифтові дивовижні ... Просто використовуйте дивовижну бібліотеку шрифтів, і додати значок до текстового поля було б так само просто:

myTextField.setLeftViewFAIcon(icon: .FAPlus, leftViewMode: .always, textColor: .red, backgroundColor: .clear, size: nil)

Спочатку вам потрібно буде встановити цю швидку бібліотеку: https://github.com/Vaberer/Font-Awesome-Swift


5
Чому варто додати всю бібліотеку лише для отримання одного гліфа?

0

Це модифікована версія відповіді Марка Мойкенса з додаванням прокладки між зображенням та текстом та регульованим розміром зображення, якщо комусь це потрібно.

Швидкий 4

    import UIKit

    @IBDesignable
    class TextFieldWithImage: UITextField {

        override func leftViewRect(forBounds bounds: CGRect) -> CGRect {
            return super.leftViewRect(forBounds: bounds)
        }

        @IBInspectable var leftImage: UIImage? {
            didSet {
                updateView()
            }
        }
        @IBInspectable var leftPadding: CGFloat = 0 {
            didSet {
                updateView()
            }
        }
        @IBInspectable var rightPadding: CGFloat = 0 {
            didSet {
                updateView()
            }
        }
        @IBInspectable var imageMaxHeight: CGFloat = 0 {
            didSet {
                updateView()
            }
        }

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

        func updateView() {
            if let image = leftImage {
                leftViewMode = UITextField.ViewMode.always

                let containerSize = calculateContainerViewSize(for: image)
                let containerView = UIView(frame: CGRect(x: 0, y: 0, width: containerSize.width, height: containerSize.height))

                let imageView = UIImageView(frame: .zero)
                containerView.addSubview(imageView)
                setImageViewConstraints(imageView, in: containerView)

                setImageViewProperties(imageView, image: image)

                leftView = containerView
            } else {
                leftViewMode = UITextField.ViewMode.never
                leftView = nil
            }

            attributedPlaceholder = NSAttributedString(string: placeholder != nil ? placeholder! : "",
                    attributes: [NSAttributedString.Key.foregroundColor: color])
        }

        private func calculateContainerViewSize(for image: UIImage) -> CGSize {
            let imageRatio = image.size.height / image.size.width
            let adjustedImageMaxHeight = imageMaxHeight > self.frame.height ? self.frame.height : imageMaxHeight

            var imageSize = CGSize()
            if image.size.height > adjustedImageMaxHeight {
                imageSize.height = adjustedImageMaxHeight
                imageSize.width = imageSize.height / imageRatio
            }

            let paddingWidth = leftPadding + rightPadding

            let containerSize = CGSize(width: imageSize.width + paddingWidth, height: imageSize.height)
            return containerSize
        }

        private func setImageViewConstraints(_ imageView: UIImageView, in containerView: UIView) {
            imageView.translatesAutoresizingMaskIntoConstraints = false
            imageView.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true
            imageView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor).isActive = true
            imageView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor, constant: -rightPadding).isActive = true
            imageView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor, constant: leftPadding).isActive = true
        }

        private func setImageViewProperties(_ imageView: UIImageView, image: UIImage) {
            imageView.contentMode = .scaleAspectFit
            imageView.image = image
            imageView.tintColor = color
        }
    }

0

Швидкий 5

Схожий на @Markus, але у Swift 5 :

emailTextField.leftViewMode = UITextField.ViewMode.always
emailTextField.leftViewMode = .always

0

SwiftUI

RoundedRectangle(cornerRadius: 50)
                .frame(height: 40)
                .colorInvert() // sets the background white
            .padding()
            .shadow(radius: 12) // adds shadow to the rectangle
                .overlay(
                    HStack(spacing: 20){

                        Image(systemName: "person")
                            .resizable()
                            .aspectRatio(contentMode: .fit)

                        TextField("Username ", text: $username)
                            .font(Font.custom("Arial", size: 25))


                            .font(.title)
                    }
                    .padding()
                    .padding()
                )

Результати


0

Використовуючи розширення в 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
     }

  }

Використовуйте код для налаштування зображення зліва: -

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

Вихід :)

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.