在UITextField的开头创建空间

Lin*_*rth 133 cocoa-touch uitextfield ios swift

我想在UITextField的开头留一点空间,就像这里一样: 向UITextField添加左边距

但我不知道如何用Swift做到这一点.

Haa*_*nti 253

这就是我现在正在使用的:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特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)
    }
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特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)
    }
}
Run Code Online (Sandbox Code Playgroud)

我从来没有设置其他填充,但你可以调整.这个类没有处理文本字段上的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;
}
Run Code Online (Sandbox Code Playgroud)


Phe*_*ter 172

如果使用扩展名,则可以避免对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
    }
}
Run Code Online (Sandbox Code Playgroud)

当我需要在我的应用程序中的任何位置设置文本字段的填充时,我只需执行以下操作:

    textField.setLeftPaddingPoints(10)
    textField.setRightPaddingPoints(10)
Run Code Online (Sandbox Code Playgroud)

使用Swift扩展,不需要子类UITextField

希望这可以帮助!

  • 优秀的解决方案,非常优雅 我做的唯一改变是我将它们添加到一个函数中,所以我得到了类似textField.setPaddingFor(left:10,right:10)的东西.两个参数都是可选的,因此如果你传递nil,填充将为0. (7认同)
  • 大!但是如果设置textField.clearButtonMode = .always,则必须仅设置左边距.右边的填充将向右移动清除按钮. (4认同)
  • 一种观察。它更像是前导/尾随填充。但是,奇怪的是它响应文本字段的文本对齐!不是应用程序语言的方向。 (2认同)

ak2*_*k2g 67

X,Y,Z是您想要的值

textField.layer.sublayerTransform = CATransform3DMakeTranslation(x, y, z)
Run Code Online (Sandbox Code Playgroud)

  • 这似乎不适用于textField.clearButtonMode = UITextFieldViewMode.Always - 清除按钮也移动到右侧 (9认同)

onC*_*ion 38

可以通过设置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
Run Code Online (Sandbox Code Playgroud)

我刚刚添加/放置UIView了文本字段的左侧和右侧.所以现在键入将在视图之后开始.

谢谢

希望这有助于......

  • 如果有人需要“objective c”,这里是代码, UIView* paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 15, self.userNameTxtFldOutlet.frame.size.height)]; 自己。userNameTxtFldOutlet.leftView = paddingView; 自己。userNameTxtFldOutlet.leftViewMode = UITextFieldViewModeAlways; (2认同)

Teo*_*aru 31

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     
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 伙计们,我将方法的名称从 `paddingLeft` 修改为 `paddingLeftCustom`,另一个也是。如果我没有这样做,那么当您使用具有 UITextView(如 UISearchBar)的视图时,会出现一个跟随我两周的错误。只是...不要设置默认名称。 (2认同)

Fab*_*bio 24

使用我的扩展 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
    }
}
}
Run Code Online (Sandbox Code Playgroud)

如何使用

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

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

// padding left
yourTextField.addPadding(padding: .left(10)) 
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的解决方案。 (2认同)

iOS*_*iOS 16

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
Run Code Online (Sandbox Code Playgroud)

像这样我们也可以创建右侧.(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() {

    }
}
Run Code Online (Sandbox Code Playgroud)

现在像这样调用这个函数.

//This single line is enough
SharedClass.sharedInstance.textFieldLeftPadding(textFieldName:yourTF)
Run Code Online (Sandbox Code Playgroud)

  • 与为这样一个小任务引入一个共享类相比,扩展工作不应该更好吗? (2认同)

liv*_*tay 15

简单的swift 3解决方案 - 向viewDidLoad添加代码:

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

不需要可笑的长代码


Har*_*kar 10

在Swift 3中为UITextField创建填充视图

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


de.*_*de. 8

在大多数情况下,您可以将其视为技术问题,但所有示例都无法区分framebounds正确。在子视图中引用视图的高度时,请使用bounds\xe2\x80\x93 ,否则一旦将某些变换应用于父视图,您可能会遇到麻烦。
\n请参阅下面更新的代码(基于 Pheepster 的答案)。

\n
extension UITextField {\n\n    func setLeftPadding(_ amount: CGFloat = 10) {\n\n        let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: amount, height: self.bounds.size.height))\n        self.leftView = paddingView\n        self.leftViewMode = .always\n    }\n\n    func setRightPadding(_ amount: CGFloat = 10) {\n\n        let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: amount, height: self.bounds.size.height))\n        self.rightView = paddingView\n        self.rightViewMode = .always\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n


小智 7

子类化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()
Run Code Online (Sandbox Code Playgroud)


Mus*_*tri 7

简单的方法:通过扩展 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
       }
   }

}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样设置任何边缘的填充:

textField.setPadding(left: 5, right: 5)
Run Code Online (Sandbox Code Playgroud)


Car*_*ess 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)
    }

}
Run Code Online (Sandbox Code Playgroud)

参考:升级到Swift 4.2.

编辑:帐户清除按钮.


PAC*_*PAC 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
Run Code Online (Sandbox Code Playgroud)


Pay*_*ler 6

我更喜欢使用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))
    }
}
Run Code Online (Sandbox Code Playgroud)


Sha*_*ngh 6

这一行代码救了我:

对于 Xamarin.iOS:

textField.Layer.SublayerTransform = CATransform3D.MakeTranslation(5, 0, 0);
Run Code Online (Sandbox Code Playgroud)

对于斯威夫特:

textField.layer.sublayerTransform = CATransform3DMakeTranslation(5, 0, 0);
Run Code Online (Sandbox Code Playgroud)


小智 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
Run Code Online (Sandbox Code Playgroud)

这个对我有用 :)