Bir UITextField'ın başlangıcında alan oluşturun


158

Bir UITextField'ın başında biraz boşluk bırakmak istiyorum, aynen burada olduğu gibi: UITextField'a sol kenar boşluğu ekle

Ama bunu Swift ile nasıl yapacağımı bilmiyorum.


Peki, Objective-C'de swift nesneleri alt sınıflandıramazsınız, ancak bunu tam tersi şekilde yapabilirsiniz ... Öyleyse, sanırım sadece yanıtı ayarlayıp şu şekilde birleştirirsiniz: developer.apple.com/library/prerelease/ ios / dokümantasyon / Swift /…
Grady Player

2
Bu muhtemelen en iyi çözüm değildir, ancak bir uiview * paddingView yapabilir ve yapabilirsiniz UITextField.leftView = paddingView. bu nedenle dolgu görünümüne istediğiniz genişliği verin.
ipalibowhyte

1
dolgu görünümü, istediğiniz genişliğe sahip bir vanilya UIView olacaktır
Grady Player

1
Swift 5 için: textField.layoutMargins.left = 20
Oleksandr

Yanıtlar:


295

Şu anda kullandığım şey bu:

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

Asla başka bir dolgu ayarlamam ama ince ayar yapabilirsiniz. Bu sınıf, metin alanında rightView ve leftView ile ilgilenmez. Eğer bunun doğru bir şekilde işlenmesini istiyorsanız, şöyle bir şey kullanabilirsiniz (örnek objc'de ve sadece rightView'a ihtiyacım vardı:

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

Genişliği ve yüksekliği hesaplarken neden üst ve sol girintileri ikiye katlıyorsunuz? Bunu yapmana gerek yok. İlgili iki girintiyi birbirine eklemeli ve toplamı orijinal sınırlardan çıkarmalısınız. Ya da sırayla ikisini de çıkarın.
Kül

1
@ Mr.UB Mevcut cihazın hangi platformda olduğunu kontrol edin ve buna göre farklı dolgu oluşturun. stackoverflow.com/questions/4567728/… . Muhtemelen bunun gibi bir şeyle
Haagenti

Apple, newBoundsyöntemin eşdeğerini UIEdgeInsetsInsetRectişlevle birlikte sağlar. Bunun yerine yöntemi return self.newBounds(bounds)kullanabilir return UIEdgeInsetsInsetRect(bounds, padding)ve kaldırabilirsiniz newBounds.
Mobil Dan

Metin alanınız birden çok satırdan oluşuyorsa, bu, yer tutucu metni ortalanır ve textAlignment = .left ve contentVerticalAlignment = .top
Code Wiget

@Ryan Uzun zaman oldu, ancak bir UITextField sadece tek satırlık sanmıştım. Daha sonra çok satırlı için bir UITextView kullanılmalıdır.
Haagenti

204

Bir uzantı kullanırsanız, UITextField'ı alt sınıflara ayırmanıza gerek yoktur ve yeni işlev, uygulamanızdaki herhangi bir UITextField için kullanılabilir hale getirilecektir:

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

Uygulamamda herhangi bir yerde bir metin alanının dolgusunu ayarlamam gerektiğinde, aşağıdakileri yapıyorum:

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

Swift uzantılarını kullanarak, işlevsellik, alt sınıflandırma olmaksızın doğrudan UITextField'e eklenir.

Bu yardımcı olur umarım!


8
Mükemmel çözüm, çok şık. Yaptığım tek değişiklik onları bir işleve eklememdi, böylece textField.setPaddingFor (sol: 10, sağ: 10) gibi bir şey elde ettim. Her iki parametre de isteğe bağlıdır, dolayısıyla sıfır geçerseniz dolgu 0 olacaktır.
Nermin Sehic

5
Harika! Ancak textField.clearButtonMode = .always'i ayarlarsanız, yalnızca sol dolguyu ayarlamanız gerekir. Sağ dolgu, temizle düğmesini sağa hareket ettirecektir.
Peter Kreinz

2
Bir gözlem. Daha çok öndeki / sondaki dolgu gibi. Ancak garip olan şey, metin alanı metin hizalamasına tepki vermesidir !! uygulamanın dili yönü değil.
hasan

UILabel'de nasıl ayarlanır?
Masum

Harika! Yer tutucu için olduğu kadar ana metin için de çalışır.
Akash Bhardwaj

70

X, Y, Z istediğiniz değerlerinizdir

textField.layer.sublayerTransform = CATransform3DMakeTranslation(x, y, z)

10
Bu, textField.clearButtonMode = UITextFieldViewMode ile çalışmıyor gibi görünüyor. Her zaman - temizle düğmesi de sağa taşınır
CaptainProton

1
Temizle düğmesinin gösterilmesi gerektiğinde çalışmaz ... temizle düğmesi de taşınır.
xdev

Bu cevap kısadır, ancak tam değildir ve daha sonra hata verebilir. @Adrian harika bir noktaya sahipsin, ama yolu bu değil. Bunu bir alt sınıfla yapmanın nedeni, tüm uç durumlar içindir. Bu kod muhtemelen alt sınıf çözümünden önce çökecektir. Ancak, kesinlikle gerekli olmayan ve verilen kitaplıkları kullanarak sağlanabilecek bir kod
yazmamanız konusunda haklısınız

48

Böyle marj ayarı tarafından sağlanabilir leftView/ rightViewetmek UITextField.

Swift 4 için güncellendi

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

UIViewMetin alanının soluna ve sağına bir ekledim / yerleştirdim . Yani şimdi yazıya görünümden sonra başlayacak.

Teşekkürler

Umarım bu yardımcı olmuştur ...


1
"nesnel c" de birine ihtiyaç duyulursa, burada kod, UIView * paddingView = [[UIView tahsis] initWithFrame: CGRectMake (0, 0, 15, self. userNameTxtFldOutlet.frame.size.height)]; öz. userNameTxtFldOutlet.leftView = paddingView; öz. userNameTxtFldOutlet.leftViewMode = UITextFieldViewModeAlways;
Avaan

1
Bu çözüm, yukarıda bahsedilen alt sınıflamadan çok daha temizdir. Mümkün olduğunca alt sınıflamadan kaçınılmalıdır. Aşağıdaki krakendev.io/blog/subclassing-can-suck-and-heres-why
Sylvain

34

Swift 4, Xcode 9

Pheepster'ın cevabını beğendim , ancak VC kodu veya herhangi bir alt sınıflandırma gerektirmeden hepsini uzantıdan yapsak nasıl olur:

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
Tal

Olabilir. Ben, kendim için, alıcıyı asla aramam, böylece beni rahatsız etmez.
Teodor Ciuraru

2
Çocuklar, ben den yöntemlerinin isimlerini modifiye paddingLeftetmek paddingLeftCustomve çok diğeri. Bunu yapmamış olsaydım, UITextView'a sahip Görünümleri (UISearchBar gibi) kullanırken beni iki hafta takip eden bir hata ortaya çıkardı. Sadece ... varsayılan isimleri belirlemeyin.
Teodor Ciuraru

18

içinde Swift 4.2 ve Xcode 10

Başlangıçta metin alanım böyledir.

görüntü açıklamasını buraya girin

Sol tarafa dolgu ekledikten sonra metin alanım ...

görüntü açıklamasını buraya girin

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

Bunun gibi sağ tarafı da oluşturabiliriz. (TextFieldName.rightViewMode = .always)

SharedInstance tür kodunu istiyorsanız (Her depoyu bir kez yazın) aşağıdaki koda bakın.

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

    }
}

Şimdi bu işlevi şöyle adlandırın.

//This single line is enough
SharedClass.sharedInstance.textFieldLeftPadding(textFieldName:yourTF)

2
Uzantı, böylesine küçük bir görev için paylaşılan bir sınıf sunmaktansa daha iyi çalışmamalı mı?
Sharkes Monken

@ Sharkes Monken, anlayamadım
iOS

@ Sharkes Monken, lütfen benim için açıklayabilir misin? Teşekkür ederim.
iOS

1
Sanırım bu işlev için UITextField uzantısı anlamına geliyor, bu yardımcı işlev için singleton iyi değil
logan.Nguyen

15

Uzantımı Swift 5 test etti:

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

Nasıl kullanılır

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

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

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

@ JoséRaúlToledanoR THX :)
Fabio

Zarif. Teşekkür ederim.
Carlo

@Carlo Grazie mille Carlo :)
Fabio

14

Simple swift 3 çözümü - viewDidLoad'a kod ekleyin:

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

Gülünç derecede uzun koda gerek yok


Bu, bir UISearchBar içindeki UITextField için çalışmaz. :( Bu durumda özellikle çalışan çözüme ihtiyacım var :(
Miki

@livtay Bu, clearButtonMode'u kullandığınızda veya bir leftView'e sahip olmak istediğinizde çalışmayacaktır. Bu hızlı bir kazançtır, ancak girdiğiniz deliğin farkında olun.
Haagenti

10

Swift 5'te UITextField için dolgu görünümü oluşturmak için

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

8

Alt sınıflandırma UITextField, gitmenin yoludur. Bir oyun alanı açın ve aşağıdaki kodu ekleyin:

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

Bu neredeyse mükemmel. Muhtemelen benzer bir yöntemi olan bir yer tutucunuz vardır: "placeholderRectForBounds" ki bunu da geçersiz kılmalısınız ve x olarak eklediğiniz şey genişlikten çıkarılmalıdır, aksi takdirde metin uzunluğunun ötesine geçtiğinde ne tür olduğunu göremezsiniz. the field
Haagenti

sol 25 ise, eşit dolguya sahip olmak için genişlik eksi 50 olmalıdır
Haagenti

7

İşte Haagenti cevabı Swift 4.2 güncellendi:

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

}

Referans: Swift 4.2'ye Yükseltme .

Düzenleme : Hesap temizle düğmesi.


6

Gerekli doldurma alanıyla UIView oluşturun ve textfield.leftView üyesine ekleyin ve textfield.leftViewMode üyesini UITextFieldViewMode.Always olarak ayarlayın.

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

6

Bu tek satırlık kod beni kurtardı:

Xamarin.iOS için:

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

Swift için:

textField.layer.sublayerTransform = CATransform3DMakeTranslation(5, 0, 0);

5

Bu kodu 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

Benim için çalışıyor :)


4

ScareCrow'un Swift 3'teki yanıtı

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

4

Swift 3'te, yapıcısında ayarlanan girinti ile özel UITextField kullanabilirsiniz. Bir denetleyicide ekstra bildirime gerek yok.

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

Kolay yol: bunu UITextField'ı genişleterek yapmak

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

}

Daha sonra bu şekilde herhangi bir kenara dolgu ayarlayabilirsiniz:

textField.setPadding(left: 5, right: 5)

aynı kodu deneyin, ancak iOS 13'te renkli sol ve sağ görünümlerle ve xCode 11 ile oluşturun ....)) textView'ın iç kısımlarını nasıl değiştirdiğini ve görünümleri doğru hareket ettirdiğini görünce şaşıracaksınız. kenarlar, böylece eklenen görünümler tam olarak görünmez
Massmaker

4

Xcode storyboard'ları aracılığıyla dolguyu ayarlamama ve yeniden kullanılabilir durumda tutmam için IBDesignablesınıf ve IBInspectableözellikleri kullanmayı tercih ediyorum . Kodu Swift 4'te çalışacak şekilde de güncelledim.

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

* Swift 5'te UITextField'ı Genişletme *

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

0

LeftView ve Swift5 + için orijinal cevabı genişletmek için

class TextField: UITextField {

let padding = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5)
override open func textRect(forBounds bounds: CGRect) -> CGRect {
    let paddedRect = bounds.inset(by: self.padding)
    if (self.leftViewMode == .always || self.leftViewMode == .unlessEditing) {
        return self.adjustRectOriginForLeftView(bounds: paddedRect)
    }
    return paddedRect
}
override open func placeholderRect(forBounds bounds: CGRect) -> CGRect {
    let paddedRect = bounds.inset(by: self.padding)
    if (self.leftViewMode == .always || self.leftViewMode == .unlessEditing) {
        return self.adjustRectOriginForLeftView(bounds: paddedRect)
    }
    return paddedRect;
}
override open func editingRect(forBounds bounds: CGRect) -> CGRect {
    let paddedRect = bounds.inset(by: self.padding);
    if (self.leftViewMode == .always || self.leftViewMode == .unlessEditing) {
        return self.adjustRectOriginForLeftView(bounds: paddedRect)
    }
    return paddedRect;
}

func adjustRectOriginForLeftView(bounds : CGRect) -> CGRect{
    var paddedRect = bounds;
    paddedRect.origin.x += self.leftView!.frame.width
    return paddedRect
    
}

}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.