Créer un espace au début d'un UITextField

149

Je veux laisser un peu d'espace au début d'un UITextField, comme ici: Ajouter une marge gauche à UITextField

Mais je ne sais pas comment faire ça avec Swift.

LinusGeffarth
la source
eh bien, vous ne pouvez pas sous-classer les objets Swift dans Objective-C, mais vous pouvez le faire dans l'autre sens ... Donc je suppose que vous venez d'ajuster la réponse et de la combiner avec: developer.apple.com/library/prerelease/ ios / documentation / Swift /…
Grady Player
1
Ce n'est probablement pas la meilleure solution, mais vous pouvez créer un uiview * paddingView et le faire UITextField.leftView = paddingView. alors donnez au rembourrage la largeur souhaitée.
ipalibowhyte
1
la vue de remplissage serait juste un UIView vanille qui a la largeur que vous souhaitez
Grady Player
Pour Swift 5: textField.layoutMargins.left = 20
Oleksandr

Réponses:

283

Voici ce que j'utilise actuellement:

Swift 4.2

class TextField: UITextField {

    let padding = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5)

    override open func textRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: padding)
    }

    override open func placeholderRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: padding)
    }

    override open func editingRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: padding)
    }
}

Swift 4

class TextField: UITextField {

    let padding = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5)

    override open func textRect(forBounds bounds: CGRect) -> CGRect {
        return UIEdgeInsetsInsetRect(bounds, padding)
    }

    override open func placeholderRect(forBounds bounds: CGRect) -> CGRect {
        return UIEdgeInsetsInsetRect(bounds, padding)
    }

    override open func editingRect(forBounds bounds: CGRect) -> CGRect {
        return UIEdgeInsetsInsetRect(bounds, padding)
    }
}

Swift 3:

class TextField: UITextField {

    let padding = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5)

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return UIEdgeInsetsInsetRect(bounds, padding)
    }

    override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
        return UIEdgeInsetsInsetRect(bounds, padding)
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return UIEdgeInsetsInsetRect(bounds, padding)
    }
}

Je n'ai jamais défini un autre rembourrage, mais vous pouvez modifier. Cette classe ne prend pas en charge la rightView et la leftView sur le champ de texte. Si vous voulez que cela soit géré correctement, vous pouvez utiliser quelque chose comme (exemple dans objc et je n'avais besoin que du rightView:

- (CGRect)textRectForBounds:(CGRect)bounds {
    CGRect paddedRect = UIEdgeInsetsInsetRect(bounds, self.insets);

    if (self.rightViewMode == UITextFieldViewModeAlways || self.rightViewMode == UITextFieldViewModeUnlessEditing) {
        return [self adjustRectWithWidthRightView:paddedRect];
    }
    return paddedRect;
}

- (CGRect)placeholderRectForBounds:(CGRect)bounds {
    CGRect paddedRect = UIEdgeInsetsInsetRect(bounds, self.insets);

    if (self.rightViewMode == UITextFieldViewModeAlways || self.rightViewMode == UITextFieldViewModeUnlessEditing) {
        return [self adjustRectWithWidthRightView:paddedRect];
    }
    return paddedRect;
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
    CGRect paddedRect = UIEdgeInsetsInsetRect(bounds, self.insets);

    if (self.rightViewMode == UITextFieldViewModeAlways || self.rightViewMode == UITextFieldViewModeWhileEditing) {
        return [self adjustRectWithWidthRightView:paddedRect];
    }
    return paddedRect;
}

- (CGRect)adjustRectWithWidthRightView:(CGRect)bounds {
    CGRect paddedRect = bounds;
    paddedRect.size.width -= CGRectGetWidth(self.rightView.frame);

    return paddedRect;
}
Haagenti
la source
Pourquoi doublez-vous les encarts supérieur et gauche lors du calcul de la largeur et de la hauteur? Je ne devrais pas avoir besoin de faire ça. Vous devez ajouter les deux encarts pertinents ensemble et soustraire le total des limites d'origine. Ou tout simplement soustraire les deux dans l'ordre.
Ash
1
@ Mr.UB Vérifiez la plate-forme de l'appareil actuel et créez un rembourrage différent en fonction de cela. stackoverflow.com/questions/4567728/… . Probablement avec quelque chose comme ça
Haagenti
Apple fournit l'équivalent de la newBoundsméthode avec la UIEdgeInsetsInsetRectfonction. Au lieu de cela, return self.newBounds(bounds)vous pouvez utiliser return UIEdgeInsetsInsetRect(bounds, padding)et supprimer la newBoundsméthode.
Mobile Dan
Si votre champ de texte comporte plusieurs lignes, cela rend le texte de l'espace réservé centré et remplace textAlignment = .left et contentVerticalAlignment = .top
Code Wiget
@Ryan Cela fait un moment, mais un UITextField est une ligne seulement je pensais. Un UITextView doit alors être utilisé pour la multiligne.
Haagenti du
196

Si vous utilisez une extension, il n'est pas nécessaire de sous-classer UITextField et la nouvelle fonctionnalité sera mise à disposition de n'importe quel UITextField de votre application:

extension UITextField {
    func setLeftPaddingPoints(_ amount:CGFloat){
        let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: amount, height: self.frame.size.height))
        self.leftView = paddingView
        self.leftViewMode = .always
    }
    func setRightPaddingPoints(_ amount:CGFloat) {
        let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: amount, height: self.frame.size.height))
        self.rightView = paddingView
        self.rightViewMode = .always
    }
}

Lorsque j'ai besoin de définir le remplissage d'un champ de texte n'importe où dans mon application, je fais simplement ce qui suit:

    textField.setLeftPaddingPoints(10)
    textField.setRightPaddingPoints(10)

En utilisant les extensions Swift, la fonctionnalité est ajoutée directement à UITextField sans sous-classification.

J'espère que cela t'aides!

Pheepster
la source
8
Excellente solution, très élégante. Le seul changement que j'ai fait est que je les ai ajoutés dans une fonction, donc j'obtiens quelque chose comme textField.setPaddingFor (gauche: 10, droite: 10). Les deux paramètres sont facultatifs, donc si vous passez nil, le remplissage sera de 0.
Nermin Sehic
4
Génial! Mais si vous définissez textField.clearButtonMode = .always, vous devez définir uniquement le remplissage de gauche. Le remplissage de droite déplacera le bouton d'effacement vers la droite.
Peter Kreinz
2
Une observation. Cela ressemble plus à un remplissage de début / de fin. Mais, ce qui est étrange, c'est qu'il répond à l'alignement du texte du champ de texte !! pas la direction de la langue de l'application.
hasan
comment définir dans UILabel?
innocent
Génial! Fonctionne aussi bien pour le texte principal que pour l'espace réservé.
Akash Bhardwaj
70

X, Y, Z sont vos valeurs souhaitées

textField.layer.sublayerTransform = CATransform3DMakeTranslation(x, y, z)
ak2g
la source
10
Cela ne semble pas fonctionner avec textField.clearButtonMode = UITextFieldViewMode.Always - le bouton d'effacement est également déplacé vers la droite
CaptainProton
1
Ne fonctionne pas lorsque le bouton Effacer doit être affiché ... le bouton Effacer est également déplacé.
xdev
Cette réponse est courte mais incomplète et pourrait être interrompue plus tard. @Adrian vous avez un excellent point, mais ce n'est pas la bonne façon. La raison pour laquelle vous devez le faire avec une sous-classe est pour tous les cas extrêmes. Ce code plantera probablement avant la solution de sous-classe. Mais vous avez raison de ne pas écrire de code qui n'est pas strictement nécessaire et qui peut être fourni en utilisant les bibliothèques données, mais vous ne devriez pas non plus abuser des bibliothèques standard
Haagenti
Whery cool! Thnx!
Booharin le
46

Une telle marge peut être obtenue en réglant leftView/ rightViewto UITextField.

Mis à jour pour Swift 4

// Create a padding view for padding on left
textField.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 15, height: textField.frame.height))
textField.leftViewMode = .always

// Create a padding view for padding on right
textField.rightView = UIView(frame: CGRect(x: 0, y: 0, width: 15, height: textField.frame.height))
textField.rightViewMode = .always

Je viens d'ajouter / placer un UIViewcôté gauche et droit du champ de texte. Alors maintenant, la saisie commencera après la vue.

Merci

J'espère que cela a aidé ...

en complément
la source
1
si quelqu'un a besoin de "l'objectif c" voici le code, UIView * paddingView = [[UIView alloc] initWithFrame: CGRectMake (0, 0, 15, self. userNameTxtFldOutlet.frame.size.height)]; soi. userNameTxtFldOutlet.leftView = paddingView; soi. userNameTxtFldOutlet.leftViewMode = UITextFieldViewModeAlways;
Avaan
1
Cette solution est beaucoup plus propre que le sous-classement mentionné ci-dessus. Le sous-classement doit être évité autant que possible. Je suggère la lecture suivante krakendev.io/blog/subclassing-can-suck-and-heres-why
Sylvain le
33

Swift 4, Xcode 9

J'aime la réponse de Pheepster , mais que diriez-vous de tout faire à partir de l'extension, sans nécessiter de code VC ou de sous-classement:

import UIKit

@IBDesignable
extension UITextField {

    @IBInspectable var paddingLeftCustom: CGFloat {
        get {
            return leftView!.frame.size.width
        }
        set {
            let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: newValue, height: frame.size.height))
            leftView = paddingView
            leftViewMode = .always
        }
    }

    @IBInspectable var paddingRightCustom: CGFloat {
        get {
            return rightView!.frame.size.width
        }
        set {
            let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: newValue, height: frame.size.height))
            rightView = paddingView
            rightViewMode = .always     
        }
    }
}
Teodor Ciuraru
la source
Ce serait plus sûr à fairerightView?.frame.size.width ?? 0
Tal
Ça pourrait. Pour ma part, je n'appelle jamais le getter donc ça ne me dérange pas.
Teodor Ciuraru
1
Les gars, j'ai modifié les noms des méthodes de paddingLeftà paddingLeftCustomet de l'autre aussi. Si je ne l'ai pas fait, un bogue qui m'a suivi pendant deux semaines serait apparu lorsque vous utilisiez des vues qui ont un UITextView (comme UISearchBar). Juste ... ne définissez pas les noms par défaut.
Teodor Ciuraru
17

dans Swift 4.2 et Xcode 10

Au départ, mon champ de texte est comme ça.

entrez la description de l'image ici

Après avoir ajouté un remplissage sur le côté gauche, mon champ de texte est ...

entrez la description de l'image ici

//Code for left padding 
textFieldName.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: textFieldName.frame.height))
textFieldName.leftViewMode = .always

Comme cela, nous pouvons également créer le côté droit. (TextFieldName.rightViewMode = .always)

Si vous voulez un code de type SharedInstance (écrire une fois, utilisez tous les articles), consultez le code ci-dessous.

//This is my shared class
import UIKit
class SharedClass: NSObject {
    static let sharedInstance = SharedClass()

    //This is my padding function.
    func textFieldLeftPadding(textFieldName: UITextField) {
    // Create a padding view
    textFieldName.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 3, height: textFieldName.frame.height))
    textFieldName.leftViewMode = .always//For left side padding
    textFieldName.rightViewMode = .always//For right side padding
    }

    private override init() {

    }
}

Appelez maintenant cette fonction comme ceci.

//This single line is enough
SharedClass.sharedInstance.textFieldLeftPadding(textFieldName:yourTF)
iOS
la source
2
L'extension ne devrait-elle pas mieux fonctionner plutôt que d'introduire une classe partagée pour une tâche aussi mineure?
Sharkes Monken
@ Sharkes Monken, je ne comprends pas
iOS
@ Sharkes Monken, pouvez-vous s'il vous plaît l'expliquer pour moi. Je vous remercie.
iOS
1
Je pense que cela signifie l'extension UITextField pour la fonction, le singleton pour cette fonction d'aide n'est pas bon
logan.Nguyen
14

Solution simple Swift 3 - ajoutez du code à viewDidLoad:

let indentView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 20))
textField.leftView = indentView
textField.leftViewMode = .always

Pas besoin de code ridiculement long

Livtay
la source
Cela ne fonctionne pas pour UITextField dans un UISearchBar. :( J'ai besoin de la solution qui fonctionne spécifiquement dans ce cas :(
Miki
@livtay Cela ne fonctionnera pas lorsque vous utilisez clearButtonMode ou si vous voulez avoir un leftView, etc. Ceci est une victoire rapide cependant , mais juste être conscient du trou que vous allez dans.
Haagenti
13

Utilisez mon extension Swift 5 testée:

extension UITextField {

enum PaddingSpace {
    case left(CGFloat)
    case right(CGFloat)
    case equalSpacing(CGFloat)
}

func addPadding(padding: PaddingSpace) {

    self.leftViewMode = .always
    self.layer.masksToBounds = true

    switch padding {

    case .left(let spacing):
        let leftPaddingView = UIView(frame: CGRect(x: 0, y: 0, width: spacing, height: self.frame.height))
        self.leftView = leftPaddingView
        self.leftViewMode = .always

    case .right(let spacing):
        let rightPaddingView = UIView(frame: CGRect(x: 0, y: 0, width: spacing, height: self.frame.height))
        self.rightView = rightPaddingView
        self.rightViewMode = .always

    case .equalSpacing(let spacing):
        let equalPaddingView = UIView(frame: CGRect(x: 0, y: 0, width: spacing, height: self.frame.height))
        // left
        self.leftView = equalPaddingView
        self.leftViewMode = .always
        // right
        self.rightView = equalPaddingView
        self.rightViewMode = .always
    }
}
}

Comment utiliser

// equal padding
yourTextField.addPadding(padding: .equalSpacing(10)) 

// padding right 
yourTextField.addPadding(padding: .right(10))

// padding left
yourTextField.addPadding(padding: .left(10)) 
Fabio
la source
@ JoséRaúlToledanoR THX :)
Fabio
Élégant. Je vous remercie.
Carlo le
@Carlo Grazie mille Carlo :)
Fabio
10

Pour créer une vue de remplissage pour UITextField dans Swift 5

func txtPaddingVw(txt:UITextField) {
    let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: 5, height: 5))
    txt.leftViewMode = .always
    txt.leftView = paddingView
}
Hardik Thakkar
la source
8

Sous-classer UITextField est la voie à suivre. Ouvrez une aire de jeux et ajoutez le code suivant:

class MyTextField : UITextField {
    var leftTextMargin : CGFloat = 0.0

    override func textRectForBounds(bounds: CGRect) -> CGRect {
        var newBounds = bounds
        newBounds.origin.x += leftTextMargin
        return newBounds
    }

    override func editingRectForBounds(bounds: CGRect) -> CGRect {
        var newBounds = bounds
        newBounds.origin.x += leftTextMargin
        return newBounds
    }
}

let tf = MyTextField(frame: CGRect(x: 0, y: 0, width: 100, height: 44))
tf.text = "HELLO"
tf.leftTextMargin = 25
tf.setNeedsLayout()
tf.layoutIfNeeded()
Eric Sean Conner
la source
C'est presque parfait. Vous avez probablement un espace réservé qui a une méthode similaire: "placeholderRectForBounds" que vous devez également remplacer et ce que vous ajoutez en tant que x doit être soustrait de la largeur, sinon vous ne pouvez pas voir quel type lorsque le texte dépasse la longueur de le terrain
Haagenti
si la gauche est 25, la largeur devrait être de moins 50 pour avoir un rembourrage égal
Haagenti
7

Voici la réponse de Haagenti mise à jour vers Swift 4.2:

class PaddedTextField: UITextField {

    func getPadding(plusExtraFor clearButtonMode: ViewMode) -> UIEdgeInsets {
        var padding = UIEdgeInsets(top: 11, left: 16, bottom: 11, right: 16)

        // Add additional padding on the right side when showing the clear button
        if self.clearButtonMode == .always || self.clearButtonMode == clearButtonMode {
            padding.right = 28
        }

        return padding
    }

    override open func textRect(forBounds bounds: CGRect) -> CGRect {
        let padding = getPadding(plusExtraFor: .unlessEditing)
        return bounds.inset(by: padding)
    }

    override open func placeholderRect(forBounds bounds: CGRect) -> CGRect {
        let padding = getPadding(plusExtraFor: .unlessEditing)
        return bounds.inset(by: padding)
    }

    override open func editingRect(forBounds bounds: CGRect) -> CGRect {
        let padding = getPadding(plusExtraFor: .whileEditing)
        return bounds.inset(by: padding)
    }

}

Référence: mise à niveau vers Swift 4.2 .

Modifier : comptez pour le bouton d'effacement.

Dessin animé
la source
6

Créez UIView avec l'espace de remplissage requis et ajoutez-le au membre textfield.leftView et définissez le membre textfield.leftViewMode sur UITextFieldViewMode.Always

// For example if you have textfield named title
@IBOutlet weak var title: UITextField!
// Create UIView 
let paddingView : UIView = UIView(frame: CGRectMake(0, 0, 5, 20))
//Change your required space instaed of 5.
title.leftView = paddingView
title.leftViewMode = UITextFieldViewMode.Always
PAC
la source
5

Mettez ce code dans votre viewDidLoad():

textField.delegate = self

let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: 20, height: self.textField.frame.height))
textField.leftView = paddingView
textField.leftViewMode = UITextFieldViewMode.always

Ça marche pour moi :)

D.Garcia
la source
5

Cette seule ligne de code m'a sauvé:

Pour Xamarin.iOS:

textField.Layer.SublayerTransform = CATransform3D.MakeTranslation(5, 0, 0);

Pour Swift:

textField.layer.sublayerTransform = CATransform3DMakeTranslation(5, 0, 0);
Shanu Singh
la source
4

La réponse de ScareCrow dans Swift 3

let padding = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5);

override func textRect(forBounds bounds: CGRect) -> CGRect {
    return UIEdgeInsetsInsetRect(bounds, padding)
}

override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
    return UIEdgeInsetsInsetRect(bounds, padding)
}

override func editingRect(forBounds bounds: CGRect) -> CGRect {
    return UIEdgeInsetsInsetRect(bounds, padding)
}
spogebob92
la source
4

Dans Swift 3. Vous pouvez utiliser UITextField personnalisé avec un retrait défini dans son constructeur. Pas besoin de déclaration supplémentaire dans un contrôleur.

class CustomTextField : UITextField {

private let indentView = UIView(frame: CGRect(x: 0, y:0, width: 10, height: 10))

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    self.leftView = indentView
    self.leftViewMode = .always 
        }
}
Point de photon
la source
4

Méthode simple: pour ce faire en étendant UITextField

extension UITextField {

   func setPadding(left: CGFloat? = nil, right: CGFloat? = nil){
       if let left = left {
          let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: left, height: self.frame.size.height))
          self.leftView = paddingView
          self.leftViewMode = .always
       }

       if let right = right {
           let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: right, height: self.frame.size.height))
           self.rightView = paddingView
           self.rightViewMode = .always
       }
   }

}

Ensuite, vous pouvez définir le remplissage sur n'importe quel bord de cette façon:

textField.setPadding(left: 5, right: 5)
Musa almatri
la source
essayez le même code mais avec des vues colorées -gauche- et -droite- sur iOS 13 et construisez-le avec xCode 11 ....)) vous serez surpris de la façon dont le textView change ses inserts et chaud il déplace les vues vers les bords pour que les vues ajoutées ne soient pas entièrement visibles
Massmaker
4

Je préfère utiliser la IBDesignableclasse et les IBInspectablepropriétés pour me permettre de définir le remplissage via des storyboards Xcode et de le garder réutilisable. J'ai également mis à jour le code pour qu'il fonctionne dans Swift 4.

import Foundation
import UIKit

@IBDesignable
class PaddableTextField: UITextField {

    var padding = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: 0.0)

    @IBInspectable var left: CGFloat = 0 {
        didSet {
            adjustPadding()
        }
    }

    @IBInspectable var right: CGFloat = 0 {
        didSet {
            adjustPadding()
        }
    }

    @IBInspectable var top: CGFloat = 0 {
        didSet {
            adjustPadding()
        }
    }

    @IBInspectable var bottom: CGFloat = 0 {
        didSet {
            adjustPadding()
        }
    }

    func adjustPadding() {
         padding = UIEdgeInsets(top: top, left: left, bottom: bottom, right: right)

    }

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
    }

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: UIEdgeInsets(top: top, left: left, bottom: bottom, right: right))
    }

    override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: UIEdgeInsets(top: top, left: left, bottom: bottom, right: right))
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
         return bounds.inset(by: UIEdgeInsets(top: top, left: left, bottom: bottom, right: right))
    }
}
Payne Miller
la source
2

* Extension de UITextField dans Swift 5 *

import UIKit

@IBDesignable
extension UITextField {

    @IBInspectable var paddingLeftCustom: CGFloat {
        get {
            return leftView!.frame.size.width
        }
        set {
            let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: newValue, height: frame.size.height))
            leftView = paddingView
            leftViewMode = .always
        }
    }

    @IBInspectable var paddingRightCustom: CGFloat {
        get {
            return rightView!.frame.size.width
        }
        set {
            let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: newValue, height: frame.size.height))
            rightView = paddingView
            rightViewMode = .always
        }
    }

}
Emil Georgiev
la source
0
//MARK:-  Use this class for different type of Roles

import UIKit

class HelperExtensionViewController: UIViewController {

}

//MARK:- Extension

extension UIImageView
{
    func setImageCornerRadius()
    {
        self.layer.cornerRadius = self.frame.size.height/2
        self.clipsToBounds = true
    }

    func setImageCornerRadiusInPoints(getValue:CGFloat)
    {
        self.layer.cornerRadius = getValue
        self.clipsToBounds = true
    }
}

extension UIButton
{
    func setButtonCornerRadiusOnly()
    {
        self.layer.cornerRadius = self.frame.size.height/2
        self.clipsToBounds = true
    }

    func setBtnCornerRadiusInPoints(getValue:CGFloat)
    {
        self.layer.cornerRadius = getValue
        self.clipsToBounds = true
    }


}

extension UITextField
{
    func setTextFieldCornerRadiusWithBorder()
    {
        self.layer.cornerRadius = self.frame.size.height/2
        self.layer.borderColor = UIColor.darkGray.cgColor
        self.backgroundColor = UIColor.clear
        self.layer.borderWidth = 0.5
        self.clipsToBounds = true
    }

    func setLeftPaddingPoints(_ amount:CGFloat){
        let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: amount, height: self.frame.size.height))
        self.leftView = paddingView
        self.leftViewMode = .always
    }
    func setRightPaddingPoints(_ amount:CGFloat) {
        let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: amount, height: self.frame.size.height))
        self.rightView = paddingView
        self.rightViewMode = .always
    }
}



extension UIView
{

    func setCornerRadius()
    {
        self.layer.cornerRadius = self.frame.size.height/2
        self.clipsToBounds = true
    }

    // OUTPUT 1
    func setViewCornerRadiusWithBorder()
    {
        self.layer.cornerRadius = self.frame.size.height/2
        self.layer.borderColor = UIColor.init(red: 95.0/255.0, green: 229.0/255.0, blue: 206.0/255.0, alpha: 1.0).cgColor
        self.backgroundColor = UIColor.clear
        self.layer.borderWidth = 1.0
        self.clipsToBounds = true
    }

    func layoutSubviews(myView:UIView)
    {
        let shadowPath = UIBezierPath(rect: myView.bounds)
        myView.layer.masksToBounds = false
        myView.layer.shadowColor = UIColor.lightGray.cgColor
        myView.layer.shadowOffset = CGSize(width: -1.0, height: 2.0)
        myView.layer.shadowOpacity = 0.5
        myView.layer.shadowPath = shadowPath.cgPath
    }

    func layoutSubviews2(myView:UIView)
    {
        let shadowPath = UIBezierPath(rect: myView.bounds)
        myView.clipsToBounds = true
        myView.layer.masksToBounds = false
        myView.layer.shadowColor = UIColor.black.cgColor
        myView.layer.shadowOffset = CGSize(width: 0.0, height: 1.0)
        myView.layer.shadowOpacity = 0.2
        myView.layer.shadowPath = shadowPath.cgPath

    }

    func setViewCornerRadiusInPoints(getValue:CGFloat)
    {
        self.layer.cornerRadius = getValue
        self.clipsToBounds = true
    }


    func dropShadow(scale: Bool = true) {
        layer.masksToBounds = false
        layer.shadowColor = UIColor.black.cgColor
        layer.shadowOpacity = 0.5
        layer.shadowOffset = CGSize(width: -1, height: 1)
        layer.shadowRadius = 1

        layer.shadowPath = UIBezierPath(rect: bounds).cgPath
        layer.shouldRasterize = true
        layer.rasterizationScale = scale ? UIScreen.main.scale : 1
    }

    // OUTPUT 2
    func dropShadow(color: UIColor, opacity: Float = 0.5, offSet: CGSize, radius: CGFloat = 1, scale: Bool = true) {
        layer.masksToBounds = false
        layer.shadowColor = color.cgColor
        layer.shadowOpacity = opacity
        layer.shadowOffset = offSet
        layer.shadowRadius = radius

        layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
        layer.shouldRasterize = true
        layer.rasterizationScale = scale ? UIScreen.main.scale : 1
    }

    func setGradientBackground(myview:UIView) {
        let colorTop =  UIColor(red: 100.0/255.0, green: 227.0/255.0, blue: 237.0/255.0, alpha: 1.0).cgColor
        let colorBottom = UIColor(red: 141.0/255.0, green: 109.0/255.0, blue: 164.0/255.0, alpha: 1.0).cgColor

        let gradientLayer = CAGradientLayer()
        gradientLayer.colors = [colorTop, colorBottom]
        gradientLayer.locations = [1.0, 1.0]
        gradientLayer.frame = myview.bounds

        myview.layer.insertSublayer(gradientLayer, at:0)
    }
}
Davender Verma
la source