Utwórz miejsce na początku UITextField

149

Chcę zostawić trochę miejsca na początku UITextField, tak jak tutaj: Dodaj lewy margines do UITextField

Ale nie wiem, jak to zrobić z Szybkim.

LinusGeffarth
źródło
cóż, nie możesz podklasować szybkich obiektów w Objective-C, ale możesz to zrobić na odwrót ... Więc domyślam się, że po prostu dostosujesz odpowiedź i połączysz ją z: developer.apple.com/library/prerelease/ ios / dokumentacja / Swift /…
Grady Player
1
Prawdopodobnie nie jest to najlepsze rozwiązanie, ale możesz zrobić uiview * paddingView i zrobić UITextField.leftView = paddingView. więc nadaj wyściółce żądaną szerokość.
ipalibowhyte
1
widok dopełnienia byłby po prostu waniliowym UIView, który ma szerokość, którą chcesz
Grady Player
Dla Swift 5: textField.layoutMargins.left = 20
Oleksandr

Odpowiedzi:

283

Oto, czego teraz używam:

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

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

Nigdy nie ustawiłem innej wyściółki, ale możesz dostosować. Ta klasa nie zajmuje się rightView i leftView w polu tekstowym. Jeśli chcesz, aby było to obsługiwane poprawnie, możesz użyć czegoś takiego (przykład w objc i potrzebowałem tylko 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
źródło
Dlaczego podczas obliczania szerokości i wysokości podwajasz górne i lewe wstawki? Nie powinienem tego robić. Powinieneś dodać razem dwie odpowiednie wstawki i odjąć sumę od oryginalnych granic. Lub po prostu odejmij oba po kolei.
Ash
1
@ Mr.UB Sprawdź, jaką platformą jest obecne urządzenie i na tej podstawie utwórz inne wypełnienie. stackoverflow.com/questions/4567728/… . Prawdopodobnie z czymś takim
Haagenti
Apple dostarcza odpowiednik newBoundsmetody z UIEdgeInsetsInsetRectfunkcją. Zamiast return self.newBounds(bounds)ciebie możesz użyć return UIEdgeInsetsInsetRect(bounds, padding)i usunąć newBoundsmetodę.
Mobile Dan
Jeśli pole tekstowe składa się z wielu wierszy, tekst zastępczy jest wyśrodkowany i zastępuje textAlignment = .left i contentVerticalAlignment = .top
Code
@Ryan Minęło trochę czasu, ale myślałem, że UITextField jest tylko w jednym wierszu. W takim przypadku należy użyć UITextView dla multilinii.
Haagenti,
196

Jeśli używasz rozszerzenia, nie ma potrzeby tworzenia podklasy UITextField, a nowa funkcjonalność zostanie udostępniona każdemu UITextField w Twojej aplikacji:

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

Kiedy muszę ustawić wypełnienie pola tekstowego w dowolnym miejscu w mojej aplikacji, po prostu wykonuję następujące czynności:

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

Korzystając z rozszerzeń Swift, funkcjonalność jest dodawana bezpośrednio do UITextField bez tworzenia podklas.

Mam nadzieję że to pomoże!

Pheepster
źródło
8
Doskonałe rozwiązanie, bardzo eleganckie. Jedyną zmianą, jaką wprowadziłem, było dodanie ich do jednej funkcji, dzięki czemu otrzymuję coś takiego jak textField.setPaddingFor (lewo: 10, prawo: 10). Oba parametry są opcjonalne, więc jeśli zdasz zero, dopełnienie wyniesie 0.
Nermin Sehic,
4
Wspaniały! Ale jeśli ustawisz textField.clearButtonMode = .always, musisz ustawić tylko lewe wypełnienie. Prawe wypełnienie przesunie przycisk czyszczenia w prawo.
Peter Kreinz
2
Jedna obserwacja. To bardziej przypomina dopełnienie wiodące / końcowe. Ale dziwne jest to, że reaguje na wyrównanie tekstu w polu tekstowym !! a nie kierunek języka aplikacji.
hasan
jak ustawić w UILabel?
Innocent
Wspaniały! Działa zarówno dla tekstu głównego, jak i symbolu zastępczego.
Akash Bhardwaj
70

X, Y, Z to pożądane wartości

textField.layer.sublayerTransform = CATransform3DMakeTranslation(x, y, z)
ak2g
źródło
10
Wydaje się, że to nie działa z textField.clearButtonMode = UITextFieldViewMode.Zawsze - przycisk czyszczenia również jest przesunięty w prawo
CaptainProton
1
Nie działa, gdy trzeba pokazać przycisk Wyczyść ... przycisk czyszczenia również jest przenoszony.
xdev
Ta odpowiedź jest krótka, ale nie kompletna i może się później pojawić. @Adrian, masz świetny punkt widzenia, ale to nie jest droga. Powodem, dla którego musisz to zrobić z podklasą, są wszystkie przypadki skrajne. Ten kod prawdopodobnie ulegnie awarii przed rozwiązaniem podklasy. Ale masz rację, że nie powinieneś pisać kodu, który nie jest ściśle potrzebny i może być dostarczony za pomocą danych bibliotek, ale nie powinieneś też nadużywać bibliotek standardowych
Haagenti
Fajnie! Dzięki!
Booharin
46

Taki margines można osiągnąć ustawiając leftView/ rightViewna UITextField.

Zaktualizowano dla 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

Właśnie dodałem / umieściłem UIViewpo lewej i prawej stronie pola tekstowego. Więc teraz pisanie rozpocznie się po wyświetleniu.

Dzięki

Mam nadzieję, że to pomogło ...

po zakończeniu
źródło
1
jeśli ktoś potrzebuje w "celu c", to jest kod, UIView * paddingView = [[UIView assign] initWithFrame: CGRectMake (0, 0, 15, self. userNameTxtFldOutlet.frame.size.height)]; samego siebie. userNameTxtFldOutlet.leftView = paddingView; samego siebie. userNameTxtFldOutlet.leftViewMode = UITextFieldViewModeAlways;
Avaan
1
To rozwiązanie jest znacznie czystsze niż wspomniana wyżej podklasa. W miarę możliwości należy unikać podklas. Proponuję następującą lekturę krakendev.io/blog/subclassing-can-suck-and-heres-why
Sylvain
33

Swift 4, Xcode 9

Podoba mi się odpowiedź Pheepstera , ale co powiesz na to, że zrobimy to wszystko z poziomu rozszerzenia, bez konieczności stosowania kodu VC lub jakiejkolwiek podklasy:

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
źródło
Byłoby bezpieczniejrightView?.frame.size.width ?? 0
Tal,
Może. Ja sam nigdy nie dzwonię do gettera, żeby mi to nie przeszkadzało.
Teodor Ciuraru
1
Chłopaki, zmodyfikowałem nazwy metod z paddingLeftdo paddingLeftCustomi tę drugą. Gdybym tego nie zrobił, pojawiłby się błąd, który pojawił się po dwóch tygodniach, podczas korzystania z widoków, które mają UITextView (np. UISearchBar). Po prostu ... nie ustawiaj domyślnych nazw.
Teodor Ciuraru
17

w Swift 4.2 i Xcode 10

Początkowo moje pole tekstowe wygląda tak.

wprowadź opis obrazu tutaj

Po dodaniu dopełnienia po lewej stronie moje pole tekstowe jest ...

wprowadź opis obrazu tutaj

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

W ten sposób możemy również utworzyć prawą stronę. (TextFieldName.rightViewMode = .always)

Jeśli chcesz kod typu SharedInstance (napisz raz użyj każdego towaru) zobacz poniższy kod.

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

    }
}

Teraz wywołaj tę funkcję w ten sposób.

//This single line is enough
SharedClass.sharedInstance.textFieldLeftPadding(textFieldName:yourTF)
iOS
źródło
2
Czy rozszerzenie nie powinno działać lepiej niż wprowadzenie wspólnej klasy dla tak drobnego zadania?
Sharkes Monken
@ Sharkes Monken, nie rozumiem
iOS
@ Sharkes Monken, czy możesz mi to wyjaśnić. Dziękuję Ci.
iOS
1
Myślę, że oznacza to rozszerzenie UITextField dla funkcji, singleton dla tej funkcji pomocniczej nie jest dobry
logan.Nguyen
14

Proste rozwiązanie Swift 3 - dodaj kod do viewDidLoad:

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

Nie ma potrzeby tworzenia śmiesznie długiego kodu

livtay
źródło
To nie działa dla UITextField wewnątrz UISearchBar. :( Potrzebuję rozwiązania, które działa specjalnie w tym przypadku :(
Miki
@livtay To nie zadziała, gdy użyjesz clearButtonMode lub chcesz mieć leftView itp. Jest to jednak szybka wygrana, ale pamiętaj tylko, do której dziury wchodzisz.
Haagenti
13

Przetestuj moje rozszerzenie 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
    }
}
}

Jak używać

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

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

// padding left
yourTextField.addPadding(padding: .left(10)) 
Fabio
źródło
@ JoséRaúlToledanoR THX :)
Fabio
Elegancki. Dziękuję Ci.
Carlo
@Carlo Grazie mille Carlo :)
Fabio
10

Aby utworzyć widok wypełnienia dla UITextField w języku 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
źródło
8

Podklasa UITextField jest drogą do zrobienia. Otwórz plac zabaw i dodaj następujący kod:

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
źródło
To jest prawie idealne. Prawdopodobnie masz symbol zastępczy, który ma podobną mądrą metodę: "placeholderRectForBounds", który również powinieneś nadpisać, a to, co dodajesz jako x, powinno zostać odjęte od szerokości, w przeciwnym razie nie możesz zobaczyć, jakiego typu, gdy tekst przekracza długość pole
Haagenti
jeśli po lewej stronie jest 25, szerokość powinna wynosić minus 50, aby mieć równe wypełnienie
Haagenti
7

Oto odpowiedź Haagenti zaktualizowana do wersji 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)
    }

}

Odniesienie: Aktualizacja do Swift 4.2 .

Edytuj : Konto dla przycisku czyszczenia.

CartoonChess
źródło
6

Utwórz UIView z wymaganą spacją dopełnienia i dodaj go do elementu członkowskiego textfield.leftView i ustaw element członkowski textfield.leftViewMode na UITextFieldViewMode.

// 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
źródło
5

Umieść ten kod w swoim 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

Mi to pasuje :)

D.Garcia
źródło
5

Uratowała mnie ta jedna linijka kodu:

W przypadku platformy Xamarin.iOS:

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

Dla Swift:

textField.layer.sublayerTransform = CATransform3DMakeTranslation(5, 0, 0);
Shanu Singh
źródło
4

Odpowiedź ScareCrow w 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
źródło
4

W Swift 3. Możesz używać własnego UITextField z wcięciem ustawionym w jego konstruktorze. Nie potrzeba dodatkowej deklaracji w kontrolerze.

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 
        }
}
Punkt fotonowy
źródło
4

Prosty sposób: aby to zrobić, rozszerzając 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
       }
   }

}

Następnie możesz ustawić dopełnienie do dowolnej krawędzi w ten sposób:

textField.setPadding(left: 5, right: 5)
Musa almatri
źródło
wypróbuj ten sam kod, ale z kolorowymi widokami -left- i -right- na iOS 13 i skompiluj go z xCode 11 ....)) będziesz zaskoczony, jak textView zmienia swoje wstawki i na gorąco przesuwa widoki w kierunku krawędzie, więc dodane widoki nie są w pełni widoczne
Massmaker
4

Wolę używać IBDesignableklasy i IBInspectablewłaściwości, aby umożliwić mi ustawienie dopełnienia za pomocą scenorysów Xcode i zachować możliwość ponownego użycia. Zaktualizowałem również kod do pracy w 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
źródło
2

* Rozszerzenie UITextField w 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
źródło
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
źródło