Создайте пространство в начале UITextField

149

Я хочу оставить немного места в начале UITextField, как здесь: добавить левое поле в UITextField

Но я не знаю, как это сделать со Свифтом.

LinusGeffarth
источник
ну, вы не можете создавать подклассы быстрых объектов в Objective-C, но вы можете сделать это наоборот ... Так что я думаю, что вы просто корректируете ответ и объединяете его с: developer.apple.com/library/prerelease/ IOS / Документация / Swift /…
Grady Player
1
Это, вероятно, не лучшее решение, но вы можете сделать uiview * paddingView и сделать UITextField.leftView = paddingView. так что дайте вид отступа желаемой ширины.
ipalibowhyte
1
представление отступа было бы просто ванильным UIView, ширина которого была бы вам нужна
Grady Player
Для Swift 5: textField.layoutMargins.left = 20
Александр

Ответы:

283

Это то, что я использую прямо сейчас:

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

Свифт 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)
    }
}

Я никогда не устанавливал другой отступ, но вы можете настроить его. Этот класс не заботится о rightView и leftView в текстовом поле. Если вы хотите, чтобы это обрабатывалось правильно, вы можете использовать что-то вроде (пример в objc, и мне нужен только 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
источник
Почему вы удваиваете верхнюю и левую вставки при расчете ширины и высоты? Не должно этого делать. Вы должны сложить две соответствующие вставки и вычесть сумму из исходных границ. Или просто вычтите оба по порядку.
Эш
1
@ Mr.UB Проверьте, на какой платформе используется текущее устройство, и создайте различные отступы на основе этого. stackoverflow.com/questions/4567728/… . Вероятно, с чем-то вроде этого
Haagenti
Apple предоставляет эквивалент newBoundsметода с UIEdgeInsetsInsetRectфункцией. Вместо этого return self.newBounds(bounds)вы можете использовать return UIEdgeInsetsInsetRect(bounds, padding)и удалить newBoundsметод.
Мобильный Дан
Если ваше текстовое поле состоит из нескольких строк, это делает текстовый заполнитель по центру и заменяет textAlignment = .left и contentVerticalAlignment = .top
код Wiget
@ Райан Это было давно, но UITextField - одна строка, я только думал. Затем следует использовать UITextView для многострочного.
Haagenti
196

Если вы используете расширение, нет необходимости создавать подкласс UITextField, и новая функциональность будет доступна для любого UITextField в вашем приложении:

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

Когда мне нужно установить отступ текстового поля в любом месте моего приложения, я просто делаю следующее:

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

Используя расширения Swift, функциональность добавляется в UITextField напрямую, без подклассов.

Надеюсь это поможет!

Pheepster
источник
8
Отличное решение, очень элегантно. Единственное изменение, которое я сделал, было то, что я добавил их в одну функцию, и я получил что-то вроде textField.setPaddingFor (left: 10, right: 10). Оба параметра являются необязательными, поэтому, если вы передадите nil, отступ будет 0.
Nermin Sehic
4
Большой! Но если вы установите textField.clearButtonMode = .always, вы должны установить только левый отступ. Правый отступ переместит кнопку очистки вправо.
Питер Крейнз
2
Одно наблюдение. Это больше похоже на начальные / конечные отступы. Но странно то, что он отвечает на выравнивание текста в текстовом поле !! не направление языка приложения.
Гасан
как установить в UILabel?
Невинный
Большой! Работает как для основного текста, так и для заполнителя.
Акаш Бхардвадж
70

X, Y, Z - ваши желаемые значения

textField.layer.sublayerTransform = CATransform3DMakeTranslation(x, y, z)
ak2g
источник
10
Кажется, что это не работает с textField.clearButtonMode = UITextFieldViewMode.Always - кнопка очистки также перемещается вправо
CaptainProton
1
Не работает, когда нужно показать кнопку Очистить ... кнопка очистки также перемещена.
xdev
Этот ответ короткий, но не полный, и может привести к ошибке позже. @ Адриан, ты понимаешь, но это не так. Причина, по которой вы делаете это с подклассом, - для всех крайних случаев. Этот код, вероятно, потерпит крах перед решением подкласса. Но вы правы в том, что вам не следует писать код, который не является строго необходимым и может быть предоставлен с использованием данных библиотек, но вы также не должны злоупотреблять стандартными библиотеками
Haagenti
Whery круто! Thnx!
Бухарин
46

Такой запас может быть достигнут установкой leftView/ rightViewк UITextField.

Обновлено для 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

Я просто добавил / поместил UIViewслева и справа от текстового поля. Так что теперь набор начнется после просмотра.

Спасибо

Надеюсь, это помогло ...

по окончании
источник
1
если кто-то нуждается в «цели c», то здесь есть код: UIView * paddingView = [[UIView alloc] initWithFrame: CGRectMake (0, 0, 15, self. userNameTxtFldOutlet.frame.size.height)]; самостоятельно. userNameTxtFldOutlet.leftView = paddingView; самостоятельно. userNameTxtFldOutlet.leftViewMode = UITextFieldViewModeAlways;
Avaan
1
Это решение намного чище, чем упомянутые выше подклассы. Подклассов следует избегать в максимально возможной степени. Я предлагаю следующее чтение krakendev.io/blog/subclassing-can-suck-and-heres-why
Сильвен
33

Swift 4, Xcode 9

Мне нравится ответ Pheepster , но как насчет того, чтобы сделать все это из расширения, не требуя кода VC или какого-либо подкласса:

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     
        }
    }
}
Теодор Чурару
источник
Это было бы безопаснее сделатьrightView?.frame.size.width ?? 0
Тал
Это может. Для себя я никогда не звоню добытчику, чтобы меня это не беспокоило.
Теодор Чурару
1
Ребята, я изменил имена методов с paddingLeftна paddingLeftCustomи другой тоже. Если бы я не сделал этого, ошибка, которая следовала бы за мной две недели, появилась бы, когда вы использовали Представления, которые имеют UITextView (например, UISearchBar). Просто ... не устанавливайте имена по умолчанию.
Теодор Чурару
17

в Swift 4.2 и Xcode 10

Первоначально мое текстовое поле выглядит следующим образом.

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

После добавления отступов в левой части моего текстового поля ...

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

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

Таким образом, мы можем также создать правую сторону. (TextFieldName.rightViewMode = .always)

Если вам нужен код типа SharedInstance (пишите один раз, используйте каждую программу), смотрите код ниже.

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

    }
}

Теперь вызовите эту функцию следующим образом.

//This single line is enough
SharedClass.sharedInstance.textFieldLeftPadding(textFieldName:yourTF)
IOS
источник
2
Разве расширение не должно работать лучше, чем введение общего класса для такой незначительной задачи?
Sharkes Monken
@ Sharkes Monken, я не понял
iOS
@ Акулы Монкен, пожалуйста, объясни мне это. Спасибо.
iOS
1
Я думаю, что это означает расширение UITextField для функции, синглтон для этой вспомогательной функции не годится
logan.Nguyen
14

Простое решение Swift 3 - добавьте код для viewDidLoad:

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

Нет необходимости в смехотворно длинном коде

livtay
источник
Это не работает для UITextField внутри UISearchBar. :( Мне нужно решение, которое работает именно в этом случае :(
Мики
@livtay Это не будет работать, когда вы используете clearButtonMode или хотите иметь левую версию и т. д. Это быстрая победа, но просто знайте, в
какую
13

Используйте мое расширение Swift 5, протестированное:

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

Как пользоваться

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

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

// padding left
yourTextField.addPadding(padding: .left(10)) 
Fabio
источник
@ JoséRaúlToledanoR THX :)
Фабио
Элегантный. Спасибо.
Карло
@Carlo Grazie mille Carlo :)
Фабио
10

Чтобы создать вид отступа для UITextField в 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
}
Хардик Таккар
источник
8

Подклассы UITextField это путь. Откройте игровую площадку и добавьте следующий код:

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()
Эрик Шон Коннер
источник
Это почти идеально. Возможно, у вас есть заполнитель, который имеет похожий мудрый метод: placeholderRectForBounds, который вы также должны переопределить, и то, что вы добавляете как x, должно быть вычтено из ширины, в противном случае вы не сможете увидеть, какой тип текста превышает длину текста. поле
Haagenti
если оставлено 25, ширина должна быть минус 50, чтобы иметь одинаковое заполнение
Haagenti
7

Вот ответ Haagenti, обновленный до 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)
    }

}

Ссылка: Обновление до Swift 4.2 .

Изменить : Учетная запись для кнопки очистки.

CartoonChess
источник
6

Создайте UIView с необходимым отступом и добавьте его к элементу textfield.leftView и установите элемент textfield.leftViewMode в 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
источник
5

Вставьте этот код в свой 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

Меня устраивает :)

D.Garcia
источник
5

Эта строка кода спасла меня:

Для Xamarin.iOS:

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

Для Свифта:

textField.layer.sublayerTransform = CATransform3DMakeTranslation(5, 0, 0);
Шану Сингх
источник
4

ScareCrow ответ в 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
источник
4

В Swift 3. Вы можете использовать пользовательский UITextField с отступом, который установлен в его конструкторе. Не нужно для дополнительного объявления в контроллере.

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 
        }
}
Фотон Поинт
источник
4

Простой способ: сделать это, расширив 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
       }
   }

}

Тогда вы можете установить отступ к любому краю следующим образом:

textField.setPadding(left: 5, right: 5)
Муса Алматри
источник
попробуйте тот же код, но с цветными представлениями «влево и вправо» на iOS 13 и создайте его с помощью xCode 11 ....)) вы будете удивлены тем, как textView меняет свои вставки, и в горячем режиме он перемещает представления в сторону края, так что добавленные виды не полностью видны
Massmaker
4

Я предпочитаю использовать IBDesignableкласс и IBInspectableсвойства, чтобы позволить мне устанавливать отступ с помощью раскадровок XCode и сохранять его многократное использование. Я также обновил код для работы в 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))
    }
}
Пейн Миллер
источник
2

* Расширение UITextField в 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
        }
    }

}
Эмиль Георгиев
источник
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
источник