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

Lev*_*i K 8 uitextfield ios swift

我有一个名为的文本域

nameTextField
Run Code Online (Sandbox Code Playgroud)

我用圆角磨圆了

nameTexfield.layer.cornerRadius = 5
Run Code Online (Sandbox Code Playgroud)

现在,文本字段中的文本触及左侧.我想在文本和边框之间创建填充.我发现的每个帖子都使用cgRect,但Swift不再支持它.如果你能搞清楚,请提供正确的代码,如果可以,请解释答案.我很感激帮助!我还需要知道在有代码的地方放置代码.

Bhu*_*att 26

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

第2步:如何使用

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

  • 不,这是更好的答案. (3认同)

pbo*_*dsk 14

正如@ the4kman说,斯威夫特支持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
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我这样做,我会得到这个好结果

左边填充

希望有所帮助.

更新

你要求一个功能而不是设置它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
}
Run Code Online (Sandbox Code Playgroud)

然后你'称之为viewDidLoad例如:

override func viewDidLoad() {
    super.viewDidLoad()
    addPaddingAndBorder(to: nameTextField)
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*hdy 5

如果您计划添加图像作为左视图,则最好对文本视图进行子类化,而不是添加左视图。

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