Crie espaço no início de um UITextField

149

Quero deixar um pouco de espaço no início de um UITextField, assim como aqui: Adicione margem esquerda ao UITextField

Mas não sei como fazer isso com Swift.

LinusGeffarth
fonte
bem, você não pode subclassificar objetos rápidos no Objective-C, mas pode fazer o contrário ... Então, acho que você apenas ajusta a resposta e a combina com: developer.apple.com/library/prerelease/ ios / documentation / Swift /…
Grady Player
1
Provavelmente, essa não é a melhor solução, mas você pode fazer um uiview * paddingView e fazer UITextField.leftView = paddingView. então, dê ao padding a largura desejada.
ipalibowhyte
1
a visão preenchimento seria apenas um UIView baunilha que tem a largura que você gostaria
Grady Jogador
Para Swift 5: textField.layoutMargins.left = 20
Oleksandr em

Respostas:

283

É isso que estou usando agora:

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

Eu nunca coloquei outro preenchimento, mas você pode ajustar. Esta classe não cuida do rightView e leftView no campo de texto. Se você quer que ele seja manipulado corretamente, você pode usar algo como (exemplo em objc e eu só precisava do 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
fonte
Por que você está dobrando as inserções superior e esquerda ao calcular a largura e a altura? Não deveria precisar fazer isso. Você deve adicionar as duas inserções relevantes juntas e subtrair o total dos limites originais. Ou apenas subtraia ambos em sequência.
Ash
1
@ Mr.UB Verifique qual plataforma é o dispositivo atual e crie preenchimentos diferentes com base nisso. stackoverflow.com/questions/4567728/… . Provavelmente com algo parecido com isto
Haagenti 14/03
A Apple fornece o equivalente ao newBoundsmétodo com a UIEdgeInsetsInsetRectfunção Em vez de return self.newBounds(bounds)você poderia usar return UIEdgeInsetsInsetRect(bounds, padding)e remover o newBoundsmétodo.
Mobile Dan
Se o seu campo de texto é várias linhas, o que torna o texto do espaço reservado centrado e Substitui TextAlignment = .Left e contentVerticalAlignment = .top
Código Wiget
@ Ryan Já faz um tempo, mas um UITextField é apenas uma linha, pensei. Um UITextView deve ser usado para várias linhas.
Haagenti
194

Se você usa uma extensão, não há necessidade de subclassificar UITextField e a nova funcionalidade será disponibilizada para qualquer UITextField no seu aplicativo:

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

Quando preciso definir o preenchimento de um campo de texto em qualquer lugar do meu aplicativo, basta fazer o seguinte:

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

Usando extensões Swift, a funcionalidade é adicionada diretamente ao UITextField sem subclassificação.

Espero que isto ajude!

Pheepster
fonte
8
Excelente solução, muito elegante. A única alteração que fiz foi incluí-los em uma função para obter algo como textField.setPaddingFor (esquerda: 10, direita: 10). Ambos os parâmetros são opcionais, portanto, se você passar nulo, o preenchimento será 0. #
Nermin Sehic
4
Ótimo! Mas se você definir textField.clearButtonMode = .sempre, precisará definir apenas o preenchimento esquerdo. O preenchimento à direita moverá o botão Limpar para a direita.
precisa
2
Uma observação É mais como um preenchimento à esquerda / à direita. Mas, o mais estranho é que ele responde ao alinhamento do texto do campo de texto !! não a direção do idioma do aplicativo.
Hasan
como definir em UILabel?
Inocente
Ótimo! Funciona para o texto principal e também para o espaço reservado.
Akash Bhardwaj
70

X, Y, Z são os valores desejados

textField.layer.sublayerTransform = CATransform3DMakeTranslation(x, y, z)
ak2g
fonte
10
Isso não parece trabalhar com textField.clearButtonMode = UITextFieldViewMode.Always - no botão Limpar é deslocado para a direita assim
CaptainProton
1
Não funciona quando o botão Limpar precisa ser exibido ... o botão Limpar também é movido.
Xdev
Essa resposta é curta, mas não completa, e pode surgir mais tarde. @ Adrian você tem um ótimo ponto, mas esse não é o caminho. O motivo pelo qual você deve fazer isso com uma subclasse é para todos os casos extremos. Esse código provavelmente falhará antes da solução da subclasse. Mas você está certo que você deve código não escrita que não é estritamente necessária e pode ser oferecer usando as bibliotecas de dados, mas você não deve abusar das bibliotecas padrão quer
Haagenti
Whery legal! Thnx!
Booharin
46

Essa margem pode ser alcançada configurando leftView/ rightViewpara UITextField.

Atualizado para o 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

Acabei de adicionar / colocar um UIViewlado esquerdo e direito do campo de texto. Então agora a digitação será iniciada após a visualização.

obrigado

Espero que isso tenha ajudado ...

onCompletion
fonte
1
se alguém necessário no "objetivo c" aqui é o código, UIView * paddingView = [[UIView aloc] initWithFrame: CGRectMake (0, 0, 15, self. userNameTxtFldOutlet.frame.size.height)]; auto. userNameTxtFldOutlet.leftView = paddingView; auto. userNameTxtFldOutlet.leftViewMode = UITextFieldViewModeAlways;
Avaan
1
Essa solução é muito mais limpa que a subclasse mencionada acima. A subclassificação deve ser evitada o máximo possível. Sugiro a seguinte leitura krakendev.io/blog/subclassing-can-suck-and-heres-why
Sylvain
33

Swift 4, Xcode 9

Eu gosto da resposta do Pheepster , mas que tal fazermos tudo a partir da extensão, sem exigir o código VC ou qualquer subclasse:

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
fonte
Seria mais seguro para fazerrightView?.frame.size.width ?? 0
Tal
Poderia. Eu, por mim mesmo, nunca ligo para o getter, para que não me incomode.
Teodor Ciuraru
1
Gente, eu modifiquei os nomes dos métodos de paddingLeftpara paddingLeftCustome o outro também. Se eu não fiz isso, um bug que me seguiu duas semanas teria aparecido quando você estava usando Views que possuem um UITextView (como UISearchBar). Apenas ... não defina os nomes padrão.
Teodor Ciuraru
17

no Swift 4.2 e no Xcode 10

Inicialmente, meu campo de texto é assim.

insira a descrição da imagem aqui

Depois de adicionar preenchimento no lado esquerdo, meu campo de texto é ...

insira a descrição da imagem aqui

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

Assim, também podemos criar o lado direito. (TextFieldName.rightViewMode = .always)

Se você deseja o código do tipo SharedInstance (escreva uma vez, use todos os itens), consulte o código abaixo.

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

    }
}

Agora chame essa função assim.

//This single line is enough
SharedClass.sharedInstance.textFieldLeftPadding(textFieldName:yourTF)
iOS
fonte
2
A extensão não deveria funcionar melhor em vez de introduzir uma classe compartilhada para uma tarefa tão pequena?
Sharkes Monken 20/03/19
@ Sharkes Monken, eu não entendi
iOS
@ Sharkes Monken, você pode me explicar? Obrigado.
iOS
1
Eu acho que isso significa extensão UITextField para a função, singleton para essa função auxiliar não é bom
logan.Nguyen
14

Solução swift 3 simples - adicione código ao viewDidLoad:

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

Não há necessidade de código ridiculamente longo

livtay
fonte
Isso não funciona para UITextField dentro de um UISearchBar. :( Preciso da solução que funciona especificamente nesse caso :(
Miki
@livtay isto não vai funcionar quando você usa clearButtonMode ou quer ter um leftView, etc. Esta é uma vitória rápida embora, mas apenas estar ciente do buraco que você está entrando.
Haagenti
13

Usei minha extensão Swift 5 testada:

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

Como usar

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

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

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

Para criar uma vista de preenchimento para o UITextField no 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
fonte
8

Subclassificar UITextField é o caminho a percorrer. Abra um playground e adicione o seguinte 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
fonte
Isso é quase perfeito. Você provavelmente possui um espaço reservado que possui um método semelhante: "placeholderRectForBounds", que você também deve substituir e o que você adiciona como um x deve ser subtraído da largura, caso contrário, você não pode ver qual tipo quando o texto ultrapassa o tamanho de o campo
Haagenti 21/11
Se esquerda é 25 largura deve ser de menos de 50 para ter igualdade de preenchimento
Haagenti
7

Aqui está a resposta de Haagenti atualizada para o 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)
    }

}

Referência: Atualizando para o Swift 4.2 .

Editar : conta para limpar o botão.

Desenho animado
fonte
6

Crie UIView com espaço de preenchimento necessário e adicione-o ao membro textfield.leftView e defina o membro textfield.leftViewMode como 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
fonte
5

Coloque este código no seu 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

Funciona para mim :)

D.Garcia
fonte
5

Essa linha de código me salvou:

Para o Xamarin.iOS:

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

Para Swift:

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

Resposta do ScareCrow em 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
fonte
4

No Swift 3. Você pode usar UITextField personalizado com recuo definido em seu construtor. Não precisa de declaração extra em um 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 
        }
}
Photon Point
fonte
4

Maneira fácil: fazer isso estendendo o 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
       }
   }

}

Em seguida, você pode definir o preenchimento para qualquer borda dessa maneira:

textField.setPadding(left: 5, right: 5)
Musa almatri
fonte
tente o mesmo código, mas com as visualizações esquerda e direita coloridas no iOS 13 e construa-as com o xCode 11 ....)) você ficará surpreso com a forma como o textView altera suas inserções e quente, move as visualizações para as bordas para que as vistas adicionados não são totalmente visíveis
Massmaker
4

Prefiro usar IBDesignableclasse e IBInspectablepropriedades para permitir que eu defina o preenchimento via storyboards do Xcode e mantenha-o reutilizável. Também atualizei o código para funcionar no 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
fonte
2

* Estendendo o UITextField no 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
fonte
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
fonte