Crear espacio al comienzo de un UITextField

149

Quiero dejar un poco de espacio al comienzo de un UITextField, como aquí: Agregar margen izquierdo a UITextField

Pero no sé cómo hacer eso con Swift.

LinusGeffarth
fuente
bueno, no puedes subclasificar objetos rápidos en Objective-C, pero puedes hacerlo al revés ... Así que supongo que solo ajustas la respuesta y la combinas con: developer.apple.com/library/prerelease/ ios / documentation / Swift / ...
Grady Player
1
Probablemente esta no sea la mejor solución, pero podría hacer un uiview * paddingView y hacer UITextField.leftView = paddingView. así que proporcione a la vista de relleno el ancho deseado.
ipalibowhyte
1
la vista de relleno solo sería una vista de UIV de vainilla que tiene el ancho que le gustaría
Grady Player
Para Swift 5: textField.layoutMargins.left = 20
Oleksandr

Respuestas:

283

Esto es lo que estoy usando ahora:

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

Nunca configuré otro relleno, pero puedes ajustarlo. Esta clase no se ocupa de rightView e leftView en el campo de texto. Si desea que se maneje correctamente, puede usar algo como (ejemplo en objc y solo necesitaba el 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
fuente
¿Por qué duplica las inserciones superior e izquierda al calcular el ancho y la altura? No debería necesitar hacer eso. Debe sumar las dos inserciones relevantes y restar el total de los límites originales. O simplemente restar ambos en secuencia.
Ash
1
@ Mr.UB Compruebe en qué plataforma se encuentra el dispositivo actual y cree un relleno diferente en función de eso. stackoverflow.com/questions/4567728/… . Probablemente con algo como esto
Haagenti
Apple proporciona el equivalente del newBoundsmétodo con la UIEdgeInsetsInsetRectfunción. En lugar de return self.newBounds(bounds)usted podría usar return UIEdgeInsetsInsetRect(bounds, padding)y eliminar el newBoundsmétodo.
Móvil Dan
Si su campo de texto tiene varias líneas, esto hace que el texto del marcador de posición esté centrado y sustituya textAlignment = .left y contentVerticalAlignment = .top
Code Wiget el
@ Ryan Ha pasado un tiempo, pero un UITextField es de una sola línea, pensé. Un UITextView debe usarse entonces para líneas múltiples.
Haagenti
194

Si usa una extensión, no es necesario subclasificar UITextField y la nueva funcionalidad estará disponible para cualquier UITextField en su aplicación:

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

Cuando necesito configurar el relleno de un campo de texto en cualquier parte de mi aplicación, simplemente hago lo siguiente:

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

Usando extensiones Swift, la funcionalidad se agrega al UITextField directamente sin subclases.

¡Espero que esto ayude!

Pheepster
fuente
8
Excelente solución, muy elegante. El único cambio que hice fue que los agregué a una función para obtener algo como textField.setPaddingFor (izquierda: 10, derecha: 10). Ambos parámetros son opcionales, por lo tanto, si pasa cero, el relleno será 0.
Nermin Sehic
44
¡Excelente! Pero si establece textField.clearButtonMode = .always, solo debe establecer el relleno izquierdo. El relleno derecho moverá el botón de borrar a la derecha.
Peter Kreinz
2
Una observación Es más como un relleno inicial / final. ¡Pero, lo extraño es que responde a la alineación de texto del campo de texto! No es la dirección del idioma de la aplicación.
hasan
¿Cómo establecer en UILabel?
Inocente
¡Excelente! Funciona tanto para el texto principal como para el marcador de posición.
Akash Bhardwaj
70

X, Y, Z son sus valores deseados

textField.layer.sublayerTransform = CATransform3DMakeTranslation(x, y, z)
ak2g
fuente
10
Esto no parece funcionar con textField.clearButtonMode = UITextFieldViewMode. Siempre - el botón de borrar también se mueve hacia la derecha
CaptainProton
1
No funciona cuando se necesita mostrar el botón Borrar ... el botón borrar también se mueve.
xdev
Esta respuesta es corta pero no completa y podría fallar más tarde. @ Adrian tienes un gran punto, pero este no es el camino. La razón por la que debe hacerlo con una subclase es para todos los casos límite. Este código probablemente se bloqueará antes de la solución de subclase. Pero tienes razón en que no se debe escribir código que no es estrictamente necesario y se puede proporcionar mediante el uso de las bibliotecas de dados, pero no se debe abusar de las bibliotecas estándar o bien
haagenti
Whery genial! Thnx!
Booharin
46

Tal margen se puede lograr estableciendo leftView/ rightViewa UITextField.

Actualizado para 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

Acabo de agregar / colocar un UIViewlado izquierdo y derecho del campo de texto. Entonces, la escritura comenzará después de la vista.

Gracias

Espero que esto haya ayudado ...

en la terminación
fuente
1
si alguien necesita en el "objetivo c" aquí está el código, UIView * paddingView = [[UIView alloc] initWithFrame: CGRectMake (0, 0, 15, self. userNameTxtFldOutlet.frame.size.height)]; yo. userNameTxtFldOutlet.leftView = paddingView; yo. userNameTxtFldOutlet.leftViewMode = UITextFieldViewModeAlways;
Avaan
1
Esta solución es mucho más limpia que la subclase mencionada anteriormente. Las subclases deben evitarse tanto como sea posible. Sugiero la siguiente lectura krakendev.io/blog/subclassing-can-suck-and-heres-why
Sylvain
33

Swift 4, Xcode 9

Me gusta la respuesta de Pheepster , pero ¿qué tal si lo hacemos todo desde la extensión, sin requerir código VC o ninguna subclasificación?

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
fuente
Sería más seguro hacerlorightView?.frame.size.width ?? 0
Tal
Que podría. Yo, por mi parte, nunca llamo al captador para que no me moleste.
Teodor Ciuraru
1
Chicos, modifiqué los nombres de los métodos de paddingLefta paddingLeftCustomy el otro también. Si no lo hubiera hecho, habría aparecido un error que me siguió dos semanas cuando usaba Vistas que tienen un UITextView (como UISearchBar). Simplemente ... no establezca los nombres predeterminados.
Teodor Ciuraru
17

en Swift 4.2 y Xcode 10

Inicialmente mi campo de texto es así.

ingrese la descripción de la imagen aquí

Después de agregar relleno en el lado izquierdo, mi campo de texto es ...

ingrese la descripción de la imagen aquí

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

De esta manera, también podemos crear el lado derecho. (TextFieldName.rightViewMode = .always)

Si desea un código de tipo SharedInstance (escriba una vez, use todos los artículos), consulte el siguiente código.

//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() {

    }
}

Ahora llame a esta función así.

//This single line is enough
SharedClass.sharedInstance.textFieldLeftPadding(textFieldName:yourTF)
iOS
fuente
2
¿No debería la extensión funcionar mejor en lugar de introducir una clase compartida para una tarea tan pequeña?
Sharkes Monken
@ Sharkes Monken, no entiendo
iOS
@ Sharkes Monken, ¿puedes explicarlo por mí? Gracias.
iOS
1
Creo que significa extensión UITextField para la función, singleton para esta función auxiliar no es buena
logan.Nguyen
14

Solución simple de swift 3: agregue código para viewDidLoad:

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

No es necesario un código ridículamente largo

livtay
fuente
Esto no funciona para UITextField dentro de un UISearchBar. :( Necesito la solución que funcione específicamente en ese caso :(
Miki
@livtay Esto no funcionará cuando uses clearButtonMode o quieras tener un leftView, etc. Sin embargo, esta es una victoria rápida, pero solo ten en cuenta el agujero en el que estás entrando.
Haagenti
13

Utilice mi extensión Swift 5 probado:

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

Cómo utilizar

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

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

// padding left
yourTextField.addPadding(padding: .left(10)) 
Fabio
fuente
@ JoséRaúlToledanoR THX :)
Fabio
Elegante. Gracias.
Carlo
@Carlo Grazie mille Carlo :)
Fabio
10

Para crear una vista de relleno para UITextField en 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
fuente
8

Subclasificar UITextField es el camino a seguir. Abra un patio de juegos y agregue el siguiente código:

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
fuente
Esto es casi perfecto Probablemente tenga un marcador de posición que tenga un método similar: "placeholderRectForBounds", que también debe anular y lo que agregue como una x debe sustraerse del ancho; de lo contrario, no podrá ver qué tipo cuando el texto va más allá de la longitud de el campo
Haagenti
si lo que queda es 25, el ancho debe ser menos 50 para tener un relleno igual
Haagenti
7

Aquí está la respuesta de Haagenti actualizada a 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)
    }

}

Referencia: Actualización a Swift 4.2 .

Editar : cuenta para borrar el botón.

Dibujos animados
fuente
6

Cree UIView con el espacio de relleno requerido y agréguelo al miembro textfield.leftView y establezca el miembro textfield.leftViewMode en 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
fuente
5

Pon este código en tu 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

Esto funciona para mi :)

D.Garcia
fuente
5

Esta línea de código me salvó:

Para Xamarin.iOS:

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

Para Swift:

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

La respuesta de ScareCrow en 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
fuente
4

En Swift 3. Puede usar UITextField personalizado con sangría que se establece en su constructor. No necesita una declaración adicional en un controlador.

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 
        }
}
Punto de fotones
fuente
4

Manera fácil: hacer esto extendiendo 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
       }
   }

}

Luego puede configurar el relleno en cualquier borde de esta manera:

textField.setPadding(left: 5, right: 5)
Musa almatri
fuente
intente el mismo código pero con vistas de color a la izquierda y derecha en iOS 13 y compílelo con xCode 11 ....)) se sorprenderá de cómo textView cambia sus inserciones y caliente mueve las vistas hacia los bordes para que las vistas agregadas no sean completamente visibles
Massmaker
4

Prefiero usar la IBDesignableclase y las IBInspectablepropiedades para permitirme configurar el relleno a través de los guiones gráficos de Xcode y mantenerlo reutilizable. También he actualizado el código para que funcione en 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
fuente
2

* Extendiendo UITextField en 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
fuente
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
fuente