สร้างพื้นที่ว่างที่จุดเริ่มต้นของ UITextField


149

ฉันต้องการออกจากพื้นที่ว่างที่จุดเริ่มต้นของ UITextField เช่นเดียวกับที่นี่: เพิ่มระยะขอบซ้ายไปยัง UITextField

แต่ฉันไม่รู้จะทำอย่างไรกับ Swift


ดีคุณไม่สามารถ subclass swift objects ใน Objective-C ได้ แต่คุณสามารถทำอย่างอื่นได้ ... ดังนั้นฉันเดาว่าคุณแค่ปรับคำตอบแล้วรวมเข้ากับ: developer.apple.com/library/prerelease/ ios / document / Swift / …
ผู้เล่น Grady

1
นี่อาจจะไม่ใช่ทางออกที่ดีที่สุด แต่คุณสามารถทำให้ paddingView UIView * UITextField.leftView = paddingViewและทำ เพื่อให้ช่องว่างภายในดูความกว้างที่คุณต้องการ
ipalibowhyte

1
มุมมองการขยายจะเป็นเพียง UIView ที่มีความกว้างที่คุณต้องการ
Grady Player

สำหรับ Swift 5: textField.layoutMargins.left = 20
Oleksandr

คำตอบ:


283

นี่คือสิ่งที่ฉันใช้อยู่ตอนนี้:

สวิฟต์ 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)
    }
}

สวิฟต์ 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 บน textfield หากคุณต้องการที่จะจัดการอย่างถูกต้องคุณสามารถใช้สิ่งที่ต้องการ (ตัวอย่างใน 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;
}

เหตุใดคุณเพิ่มสองเท่าของส่วนบนและด้านซ้ายเมื่อคำนวณความกว้างและความสูง ไม่ควรทำเช่นนั้น คุณควรเพิ่มทั้งสอง insets ที่เกี่ยวข้องเข้าด้วยกันและลบผลรวมจากขอบเขตเดิม หรือเพียงแค่ลบทั้งสองอย่างในลำดับ
Ash

1
@ Mr.UB ตรวจสอบว่าแพลตฟอร์มของอุปกรณ์ปัจจุบันคืออะไรและสร้างช่องว่างภายในที่แตกต่างกัน stackoverflow.com/questions/4567728/… . อาจจะมีบางอย่างเช่นนี้
Haagenti

Apple ให้ฟังก์ชันที่เทียบเท่ากับnewBoundsวิธีการ UIEdgeInsetsInsetRectแทนที่จะเป็นreturn self.newBounds(bounds)คุณสามารถใช้return UIEdgeInsetsInsetRect(bounds, padding)และลบnewBoundsวิธีการได้
มือถือ Dan

หากช่องข้อความของคุณมีหลายบรรทัดสิ่งนี้จะทำให้ตัวยึดข้อความกึ่งกลางและ super Text textAlignment = .left และ contentVerticalAlignment = .top
รหัส Wiget

@ Ryan มันนานมาแล้ว แต่ UITextField เป็นหนึ่งบรรทัดเท่านั้นที่ฉันคิด ควรใช้ UITextView สำหรับหลายบรรทัด
ฮาโกเธน

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 โดยตรงโดยไม่ต้องแบ่งคลาสย่อย

หวังว่านี่จะช่วยได้!


8
ทางออกที่ดีเลิศสง่ามาก การเปลี่ยนแปลงเพียงอย่างเดียวที่ฉันทำคือฉันเพิ่มพวกมันไว้ในฟังก์ชั่นเดียวดังนั้นฉันจึงได้รับข้อความเช่น textField.setPaddingFor (ซ้าย: 10, ขวา: 10) params ทั้งสองเป็นตัวเลือกดังนั้นถ้าคุณผ่านศูนย์จะมีค่าเป็น 0
Nermin Sehic

4
ที่ดี! แต่ถ้าคุณตั้งค่า textField.clearButtonMode = .always คุณจะต้องตั้งค่าเฉพาะช่องว่างด้านซ้าย ช่องว่างด้านขวาจะเลื่อนปุ่มล้างไปทางขวา
Peter Kreinz

2
หนึ่งการสังเกต มันเป็นเหมือนการเสริมชั้นนำ / ต่อท้าย แต่สิ่งที่แปลกก็คือมันตอบสนองต่อการจัดตำแหน่งข้อความ textfield !! ไม่ใช่ทิศทางภาษาแอป
Hasan

วิธีการตั้งค่าใน UILabel?
ผู้บริสุทธิ์

ที่ดี! ใช้งานได้กับข้อความหลักและตัวยึดตำแหน่ง
Akash Bhardwaj

70

X, Y, Z คือค่าที่คุณต้องการ

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

10
ดูเหมือนจะไม่ทำงานกับ textField.clearButtonMode = UITextFieldViewMode.Always - ปุ่มที่ชัดเจนจะถูกย้ายไปทางขวาเช่นกัน
CaptainProton

1
ไม่ทำงานเมื่อต้องการแสดงปุ่มล้าง ... ปุ่มลบจะถูกย้ายเช่นกัน
xdev

แอนเวอร์นี้สั้น แต่ไม่สมบูรณ์และอาจจะบั๊กในภายหลัง @ เอเดรียคุณมีจุดที่ดี แต่นี่ไม่ใช่วิธี เหตุผลที่คุณต้องทำกับคลาสย่อยนั้นสำหรับเคสขอบทั้งหมด รหัสนี้อาจมีปัญหาก่อนที่จะแก้ปัญหาคลาสย่อย แต่คุณถูกต้องที่คุณไม่ควรเขียนโค้ดที่ไม่จำเป็นอย่างเคร่งครัดและสามารถให้ได้โดยใช้
ไลบรารี่ที่

เย็นสบาย! ขอบคุณ!
Booharin

46

อัตรากำไรดังกล่าวสามารถทำได้โดยการตั้งค่าleftView/ การrightViewUITextField

อัปเดตสำหรับ 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
หากมีคนต้องการใน "purpose c" นี่คือรหัส, UIView * paddingView = [[UIView alloc] initWithFrame: CGRectMake (0, 0, 15, ตัวเอง userNameTxtFldOutlet.frame.size.height)]; ตนเอง userNameTxtFldOutlet.leftView = paddingView; ตนเอง userNameTxtFldOutlet.leftViewMode = UITextFieldViewModeAlways;
Avaan

1
วิธีนี้สะอาดกว่าซับคลาสย่อยที่กล่าวถึงข้างต้น การซับคลาสควรหลีกเลี่ยงให้มากที่สุด ฉันขอแนะนำการอ่านต่อไปนี้krakendev.io/blog/subclassing-can-suck-and-heres-why
Sylvain

33

Swift 4, Xcode 9

ฉันชอบคำตอบของ Pheepsterแต่วิธีการที่เราทำทั้งหมดจากส่วนขยายโดยไม่ต้องใช้รหัส VC หรือ subclassing ใด ๆ :

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

มันอาจจะ. ฉันสำหรับตัวเองไม่เคยเรียกคนที่ทะเยอทะยานดังนั้นมันจึงไม่ได้รบกวนฉัน
Teodor Ciuraru

1
พวกฉันแก้ไขชื่อของเมธอดจากpaddingLeftเป็นpaddingLeftCustomและอีกอันด้วย หากฉันไม่ได้ทำสิ่งนี้ข้อผิดพลาดที่ตามมาฉันสองสัปดาห์จะปรากฏขึ้นเมื่อคุณใช้ Views ที่มี UITextView (เช่น UISearchBar) แค่ ... อย่าตั้งชื่อเริ่มต้น
Teodor Ciuraru

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)

2
ไม่ควรให้ส่วนขยายทำงานได้ดีกว่าแนะนำคลาสที่ใช้ร่วมกันสำหรับงานย่อยเช่นนั้นหรือ
Sharkes Monken

@ Sharkes Monken ฉันไม่เข้าใจ
iOS

@ Sharkes Monken คุณช่วยอธิบายหน่อยได้ไหม ขอบคุณ.
iOS

1
ฉันคิดว่ามันหมายถึงการขยาย UITextField สำหรับฟังก์ชั่นเดี่ยวสำหรับผู้ช่วย func นี้ไม่ดี
logan.guyen

14

Simple swift 3 solution - เพิ่มรหัสลงใน viewDidLoad:

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

ไม่จำเป็นต้องใช้รหัสยาวขัน


สิ่งนี้ใช้ไม่ได้กับ UITextField ภายใน UISearchBar :( ฉันต้องการโซลูชันที่ใช้งานได้เฉพาะในกรณีนั้น :(
Miki

@livtay นี้จะไม่ทำงานเมื่อคุณใช้ clearButtonMode หรือต้องการที่จะมี leftView ฯลฯ นี้เป็น win อย่างรวดเร็วแม้ว่า แต่เพียงจะตระหนักถึงหลุมที่คุณกำลังจะไปใน.
Haagenti

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

@ JoséRaúlToledanoR THX :)
Fabio

สง่า ขอบคุณ.
คาร์โล

@Carlo Grazie mille Carlo :)
Fabio

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

}

อ้างอิง: อัพเกรดเป็น 4.2

แก้ไข : บัญชีสำหรับปุ่มที่ชัดเจน


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

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

มันเหมาะกับฉัน :)


5

รหัสหนึ่งบรรทัดนี้ช่วยฉัน:

สำหรับ Xamarin.iOS:

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

สำหรับ Swift:

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

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คุณสมบัติเพื่ออนุญาตให้ฉันตั้ง padding ผ่านกระดานเรื่องราว 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)
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.