Aggiunta rapida di icone / immagini in UITextField


101

Vorrei aggiungere un'icona / immagine in UITextField. L'icona / immagine dovrebbe essere lasciata al segnaposto.

inserisci qui la descrizione dell'immagine

Ho provato questo:

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

Grazie.


74
Hai aggiunto accidentalmente punti e virgola: D
Gerald

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

Usando @IBDesignablepossiamo farlo in modo elegante come in questo esempio: stackoverflow.com/a/51841433/8238512
Rizwan

Risposte:


121

Prova ad aggiungere emailField.leftViewMode = UITextFieldViewMode.Always

(L'impostazione predefinita leftViewModeè Never)

Risposta aggiornata per Swift 4

emailField.leftViewMode = UITextFieldViewMode.always

emailField.leftViewMode = .always

Hmm ha funzionato per me, l'hai provato con il valore aggiornato ( UITextFieldViewMode.Always)? Hai idea di cosa non abbia funzionato? (per esempio è stato compilato?)
Markus

Questo è il mio intero codice nella sezione "ViewWillAppear": "var imageView = UIImageView (); var image = UIImage (denominato: "email.png"); imageView.image = immagine; emailTextField.leftView = imageView; emailTextField.leftViewMode = UITextFieldViewMode.Always
informatiker

@informatiker Ok, quindi sei sicuro di avere i collegamenti corretti, se ad esempio imposti il ​​colore di sfondo di emailTextFieldcambia davvero? E sei sicuro che l'immagine ci sia? Ad esempio, crea un altro UIImageView e carica imagein quello per verificare che funzioni .
Markus

4
Sì grazie. Il problema era che l'icona era bianca e non era visibile su sfondo bianco.
informatiker

5
Ho continuato la mia ricerca e finalmente l'ho fatta funzionare, mi sono perso l'impostazione della cornice per la visualizzazione dell'immagine. Sembra che dobbiamo impostare il frame sull'immagine prima di aggiungerlo a uitextfield. Qualcosa di simileimageView1.frame = CGRect(x: 5, y: 0, width: userName.frame.height, height: userName.frame.height) view.addSubview(imageView1)
Sashi

123

Sahil ha un'ottima risposta e volevo prenderla ed espanderla in un @IBDesignable in modo che gli sviluppatori possano aggiungere immagini ai loro UITextFields sullo Storyboard.

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

Cosa sta succedendo qui?

Questo designabile ti consente di:

  • Imposta un'immagine a sinistra
  • Aggiungi il riempimento tra il bordo sinistro di UITextField e l'immagine
  • Imposta un colore in modo che l'immagine e il testo segnaposto corrispondano

Appunti

  • Per cambiare il colore dell'immagine devi seguire quella nota nel commento nel codice
  • Il colore dell'immagine non cambierà nello Storyboard. Devi eseguire il progetto per vedere il colore nel simulatore / dispositivo.

Progettabile nello Storyboard Storyboard

In fase di esecuzione Runtime


5
Aggiunto in imageView.contentMode = .AspectFit, per evitare il ridimensionamento dell'immagine.
Jerland2

3
Grazie mille per l'ottimo post! L'ho modificato per avere anche un'opzione RTL. Codice disponibile qui: pastebin.com/7CCm6NEB
Ali Almohsen

Bel lavoro, ragazzi! Ho finito per fare la stessa cosa anche più tardi. Ah ah
Mark Moeykens

14
che dire della spaziatura tra immagine e testo?
Zaporozhchenko Oleksandr

1
la grande risposta.
Ripa Saha

51

Voglio solo aggiungere qualche altra cosa qui:

Se vuoi aggiungere l'immagine sul UITextFieldlato sinistro usa la leftViewproprietà diUITextField

NOTA: non dimenticare di impostare leftViewModesu UITextFieldViewMode.Alwayse per il diritto rightViewModedi UITextFieldViewMode.Always anddefault èUITextFieldViewModeNever

per es

Per aggiungere un'immagine sul lato sinistro

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

Per aggiungere un'immagine sul lato destro

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

NOTA: alcune cose che devi fare attenzione durante l'aggiunta di un'immagine sul UITextFieldlato sinistro o sul lato destro.

  • Non dimenticare di fornire una cornice di ImageViewcui aggiungeraiUITextField

    lascia imageView = UIImageView (frame: CGRect (x: 0, y: 0, larghezza: 20, altezza: 20))

  • se lo sfondo dell'immagine è bianco, l'immagine non sarà visibile UITextField

  • se vuoi aggiungere un'immagine alla posizione specifica devi aggiungere ImageViewcome sottoview di UITextField.

Aggiornamento per Swift 3.0

@Mark Moeykens L'ha speso magnificamente e lo ha reso @IBDesignable .

Ho modificato e aggiunto alcune altre funzionalità (aggiungi Bottom Line e padding per l'immagine a destra) in questo.

NOTA se si desidera aggiungere un'immagine sul lato destro, è possibile selezionare l' Force Right-to-Leftopzione nel semanticgeneratore di interfacce (ma per il riempimento dell'immagine a destra non funzionerà fino a quando non si sovrascriverà il metodo rightViewRect).

inserisci qui la descrizione dell'immagine

L'ho modificato e posso scaricare il sorgente da qui ImageTextField

inserisci qui la descrizione dell'immagine


come posso aggiungerlo negli interni e chiamare nel mio viewcontroller? puoi suggerirmi
narahari_arjun

Molto semplice! crea semplicemente la funzione nell'estensione UIViewController e passa il nome dell'immagine e il ref del campo di testo quando chiami quella funzione.
Sahil

extension UIViewController {func addLeftImage (imageName: String, textField: UITextField) {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}} e chiamalo come self.addLeftImage ("imganame", textField: yourtextfield)
Sahil

ho provato a cambiare la posizione dell'icona. ma non è cambiato utilizzando questo codice
Rahul Phate

22

UITextField con immagine (sinistra o destra)

Un altro modo, ispirato ai post precedenti, per creare un'estensione.

Possiamo mettere l'immagine a destra oa sinistra

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
}

}

Uso :

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

Godere :)


1
Hai reso la mia giornata, ho personalizzato "view.backgroundColor" e "imageView.tintColor" per renderlo completamente personalizzabile. Grazie mille per la tua risposta xD
Andres Paladines

1
Questo è fantastico
Mohamed Haseel

1
Questa è la risposta migliore e più semplice
Gerardo Salazar Sánchez

14

Per creare il riempimento, mi piace posizionare l'immagine all'interno di una vista contenitore. Puoi rimuovere il colore di sfondo quando sei soddisfatto del posizionamento dell'icona.

inserisci qui la descrizione dell'immagine

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

Grazie. Buona spiegazione con i colori.
Hamid Reza Ansari

13

per Swift 3.0 aggiungi un'immagine sul lato sinistro di textField

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

6

Swift 5

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

Ho creato l'estensione

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

Risultato

inserisci qui la descrizione dell'immagine


4

2020 - soluzione ragionevole

Per quanto riguarda questa follia di Apple.

Ecco forse il modo "più chiaro", più semplice per farlo:

inserisci qui la descrizione dell'immagine

Innanzitutto, devi spostare correttamente il testo.

Nota questo QA critico: 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)
    }
    

continuando, ora dobbiamo creare e spostare l'immagine a sinistra:

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

Questo sembra essere il modo più chiaro e affidabile per farlo.


3

Ho creato un semplice IBDesignable. Usalo come preferisci. Basta fare in modo che il tuo UITextField confermi questa classe.

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

inserisci qui la descrizione dell'immagine
Un altro modo per impostare l'icona del segnaposto e impostare la spaziatura interna su 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

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

}

per favore aggiungi ussage e cosa mi serve per passare frame param?
Surya Reddy

in questa funzione Parametro "Frame" Utilizzare per la vista sinistra o destra
jethava yogesh

1

Puoi mettere questa funzione nel tuo file globale o sopra la tua classe in modo da potervi accedere nell'intera applicazione. Dopo questa procedura è possibile chiamare questa funzione secondo le proprie esigenze nell'applicazione.

        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
Benvenuto in StackOverflow, c'è un modo per fornire qualche spiegazione insieme a questo codice? Le risposte che contengono solo codice tendono ad essere eliminate perché di bassa qualità. Dai anche un'occhiata a questa guida per rispondere nella sezione della guida: stackoverflow.com/help/how-to-answer
Graham

0

Perché non scegli l'approccio più semplice. Nella maggior parte dei casi si desidera aggiungere icone come font awesome ... Usa semplicemente la libreria font awesome e sarebbe facile aggiungere un'icona a un campo di testo come questo:

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

Dovresti prima installare questa libreria rapida: https://github.com/Vaberer/Font-Awesome-Swift


5
Perché si dovrebbe aggiungere un'intera libreria solo per ottenere un glifo?

0

Questa è una versione modificata della risposta di Mark Moeykens con imbottitura aggiunta tra immagine e testo e dimensioni dell'immagine regolabili nel caso in cui qualcuno ne abbia bisogno.

Swift 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

Swift 5

Simile a @Markus, ma in 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()
                )

Risultati


0

Usando l'estensione in Swift4, possiamo facilmente mettere l'immagine a destra oa sinistra con riempimento su 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
     }

  }

Usa il codice come per l'impostazione dell'immagine a sinistra: -

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

Produzione :)

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.