ios - 如何在 Swift 中使用 NSLayoutConstraint 在 UITextField 中添加填充?

标签 ios swift uitextfield nslayoutconstraint

我有一个 UIView 的子类,其中我有 UITextField 并且想将占位符文本向右移动一点。我正在使用 NSLayoutConstraint 来设置 subview 的位置和大小。我已经创建了 UIView 并将其添加为 UITextFieldleftView,但它崩溃并指出“ View 层次结构未为约束做好准备”。下面是我的代码:

class MasterView: UIView {

let searchTextField = UITextField()
let paddingView = UIView()

override init(frame: CGRect) {
    super.init(frame: frame)

    searchTextField.placeholder = "Search videos"
    searchTextField.translatesAutoresizingMaskIntoConstraints = false
    paddingView.translatesAutoresizingMaskIntoConstraints = false
    searchTextField.leftView = paddingView
    searchTextField.leftViewMode = UITextFieldViewMode.Always

    self.addSubview(searchTextField)

}

// Gets called when using storyboard

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

override func layoutSubviews() {
    self.addConstraint(NSLayoutConstraint(item: searchTextField, attribute: NSLayoutAttribute.TopMargin, relatedBy: NSLayoutRelation.Equal, toItem: self, attribute: NSLayoutAttribute.TopMargin, multiplier: 1.0, constant: 20))

    self.addConstraint(NSLayoutConstraint(item: searchTextField, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: self, attribute: NSLayoutAttribute.Height, multiplier: 0.12, constant: 0))

    self.addConstraint(NSLayoutConstraint(item: searchTextField, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self, attribute: NSLayoutAttribute.CenterX, multiplier: 1.0, constant: 0))

    self.addConstraint(NSLayoutConstraint(item: searchTextField, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: self, attribute: NSLayoutAttribute.Width, multiplier: 1.0, constant: 0))

    self.addConstraint(NSLayoutConstraint(item: paddingView, attribute: NSLayoutAttribute.LeadingMargin, relatedBy: NSLayoutRelation.Equal, toItem: searchTextField, attribute: NSLayoutAttribute.LeadingMargin, multiplier: 1.0, constant: 0))

    self.addConstraint(NSLayoutConstraint(item: paddingView, attribute: NSLayoutAttribute.TopMargin, relatedBy: NSLayoutRelation.Equal, toItem: searchTextField, attribute: NSLayoutAttribute.TopMargin, multiplier: 1.0, constant: 0))

    self.addConstraint(NSLayoutConstraint(item: paddingView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: searchTextField, attribute: NSLayoutAttribute.Width, multiplier: 0.12, constant: 0))

    self.addConstraint(NSLayoutConstraint(item: paddingView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: searchTextField, attribute: NSLayoutAttribute.Height, multiplier: 1.0, constant: 0))

}

最佳答案

此问题的正确解决方案:

@IBDesignable
class FormTextField: UITextField {

  @IBInspectable var paddingLeft: CGFloat = 0
  @IBInspectable var paddingRight: CGFloat = 0

  override func textRect(forBounds bounds: CGRect) -> CGRect {
    return CGRect(x: bounds.origin.x + paddingLeft, y: bounds.origin.y, width: bounds.size.width - paddingLeft - paddingRight, height: bounds.size.height)
  }

  override func editingRect(forBounds bounds: CGRect) -> CGRect {
    return textRect(forBounds: bounds)
  }
}

取自here

关于ios - 如何在 Swift 中使用 NSLayoutConstraint 在 UITextField 中添加填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36976739/

相关文章:

ios - 自调整 UITableViewCell 大小

ios - resignFirstResponder 不工作

ios - Storyboard 将 View Controller 的 View 添加到另一个 View Controller iOS5+

ios - 将完成处理程序保存为对象

ios - 如何将按钮放在标签底部?

iphone - 限制在数字文本字段中复制粘贴字符串

iphone - 当我禁用按键a-z时如何在iPhone键盘上启用按键“空格”和删除按键

ios - 在 for 循环中设置变量

ios - swift 4 : Unable to get User Profile image from Facebook

swift - 自定义单元类是模型、 View 还是 Controller ?