如何在Swift 4中创建文本框填充?

12

我有一个叫做

textfield

的文本框。

Translated:

我有一个叫做textfield的文本框。

nameTextField
我用拐角做了圆角处理
nameTexfield.layer.cornerRadius = 5

现在,文本框内的文本紧贴左侧。我想在文本和边框之间创建填充。我找到的每篇文章都使用cgRect,但Swift不再支持它。如果您能弄清楚,请提供正确的代码并解释答案。非常感谢帮助!如果有任何代码,请告诉我应该放在什么位置。


2
Swift确实支持CGRect - Tamás Sengel
我在Swift中使用了CGRect方法,但它一直告诉我它不再使用。 - Levi K
你正在使用的确切方法是什么? - Tamás Sengel
我现在就会找到它。 - Levi K
只需将文本字段包装到另一个视图中,并在容器视图上制作圆角。这就是您进行填充的方法。 - Sulthan
3个回答

41

对 UITextField 左侧、右侧或两侧添加填充的自定义方法。

步骤1:- 添加此 UITextField 扩展

extension UITextField {

    enum PaddingSide {
        case left(CGFloat)
        case right(CGFloat)
        case both(CGFloat)
    }

    func addPadding(_ padding: PaddingSide) {

        self.leftViewMode = .always
        self.layer.masksToBounds = true


        switch padding {

        case .left(let spacing):
            let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: spacing, height: self.frame.height))
            self.leftView = paddingView
            self.rightViewMode = .always

        case .right(let spacing):
            let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: spacing, height: self.frame.height))
            self.rightView = paddingView
            self.rightViewMode = .always

        case .both(let spacing):
            let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: spacing, height: self.frame.height))
            // left
            self.leftView = paddingView
            self.leftViewMode = .always
            // right
            self.rightView = paddingView
            self.rightViewMode = .always
        }
    }        
}

第二步: 如何使用

// 1.  To add left padding
yourTextFieldName.addPadding(.left(20)) 

// 2.  To add right padding
yourTextFieldName.addPadding(.right(20))

// 3. To add left & right padding both
yourTextFieldName.addPadding(.both(20))

谢谢你的回答。我很感激你的帮助,但我想我会坚持第一个答案,因为它更加直接明了。谢谢!你让函数具有自定义填充的能力真是太棒了,我将来可能会用到它。 - Levi K
3
不,这是更好的答案。 - cvb
1
哇,真的很容易设置和使用。谢谢!在Swift 4和iOS 11.4中运行得非常好。 - atereshkov
顶部和底部怎么样? - M.R
这不是文本框的默认设置,我必须更新答案以解决此问题,但您可以增加文本框的高度来解决,那样会起作用。 - Bhuvan Bhatt

17

正如@the4kman所说,Swift确实支持CGRect,但语法可能已更改。

例如,您可以尝试:

@IBOutlet weak var nameTextField: UITextField! {
    didSet {
        nameTextField.layer.cornerRadius =  5
        nameTextField.layer.borderColor = UIColor.black.cgColor
        nameTextField.layer.borderWidth = 1
        let leftView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 100.0, height: 2.0))
        nameTextField.leftView = leftView
        nameTextField.leftViewMode = .always
    }
}

如果我这样做,就会得到很好的结果。

left padding

希望这有所帮助。

更新

你要求一个函数而不是在didSet中进行设置,当然可以,例如:

func addPaddingAndBorder(to textfield: UITextField) {
    textfield.layer.cornerRadius =  5
    textfield.layer.borderColor = UIColor.black.cgColor
    textfield.layer.borderWidth = 1
    let leftView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 100.0, height: 2.0))
    textfield.leftView = leftView
    textfield.leftViewMode = .always
}

然后你可以在viewDidLoad方法中这样调用:

override func viewDidLoad() {
    super.viewDidLoad()
    addPaddingAndBorder(to: nameTextField)
}

成功了!我感谢这段代码。出于某种原因,它就是无法接受那个特定代码的CGRect参数,但现在它终于能工作了。 - Levi K
有趣的是,是否有一种方法可以将此代码块制作成一个函数,比如称为“indent”,并在viewdidrun中对textfield运行它? - Levi K
谢谢,如果您能回答关于该函数的先前评论,请告诉我。 - Levi K
@LeviK 刚刚完成了 :) - pbodsk
非常有帮助。我感谢你的帮助和额外的支持! - Levi K
这可能会干扰清除按钮。 - Ahmadreza

5
如果您计划添加一个图像作为左视图,建议子类化TextView而不是添加左视图。
class UITextFieldPadding: UITextField {

    let padding = UIEdgeInsets(top: 0, left: 40, bottom: 0, right: 0)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接