如何以编程方式将约束添加到UITextField.leftView?

时间:2018-02-23 12:42:57

标签: ios swift uitextfield nslayoutconstraint

我正在创建一个将图像添加到UITextField的leftView的函数,下面是我尝试过的代码。

func setLeftImageWithColor(image:UIImage, color:UIColor, textField:UITextField) {
    let imageView = UIImageView(image: image)
    imageView.backgroundColor = color
    imageView.contentMode = UIViewContentMode.center
    textField.leftView = imageView
    textField.leftViewMode = UITextFieldViewMode.always

    let leadingConstraint = NSLayoutConstraint(item: imageView, attribute: NSLayoutAttribute.leadingMargin, relatedBy: NSLayoutRelation.equal, toItem: txtUsername, attribute: NSLayoutAttribute.leadingMargin, multiplier: 1, constant: 0)
    let topConstraint = NSLayoutConstraint(item: imageView, attribute: NSLayoutAttribute.topMargin, relatedBy: NSLayoutRelation.equal, toItem: txtUsername, attribute: NSLayoutAttribute.topMargin, multiplier: 1, constant: 0)
    let bottomConstraint = NSLayoutConstraint(item: imageView, attribute: NSLayoutAttribute.bottomMargin, relatedBy: NSLayoutRelation.equal, toItem: txtUsername, attribute: NSLayoutAttribute.topMargin, multiplier: 1, constant: 0)
    let aspectRatioConstraint = NSLayoutConstraint(item: imageView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: imageView, attribute: NSLayoutAttribute.width, multiplier: (txtUsername.frame.size.height / txtUsername.frame.size.width), constant: 0)
    NSLayoutConstraint.activate([leadingConstraint, topConstraint, bottomConstraint, aspectRatioConstraint])

}

它出错

  

由于未捕获的异常'NSGenericException'而终止应用,   原因:'无法使用锚点激活约束    和    因为他们没有   共同祖先。约束或其锚点是否引用项目   在不同的视图层次结构?这是非法的。'

如果我不添加任何约束,那么视图就像这样

enter image description here

这是我想要实现的图像

enter image description here

2 个答案:

答案 0 :(得分:4)

尝试直接在包含textView:

的视图的layoutSubviews中设置框架
override func layoutSubviews() {
    super.layoutSubviews()

    textField.leftView?.frame = CGRect(x: 0, y: 0, width: textField.bounds.height, height: textField.bounds.height)
}

<强>更新

根据请求只使用约束,让我们看一下leftViewUITextField的合作方式。

从实验开始,UITextField似乎只在需要时才将leftView添加到其视图层次结构中。所以简单地做:

textField.leftView = imageView

不会使imageView成为视图层次结构的一部分。这就是为什么如果你在这样做之后尝试创建约束就会导致崩溃。

有一种方法可以强制它将其置于查看层次结构中,这是通过在textField上强制自动布局来实现的:

// add it as a leftView
textField.leftView = imageView

// force autolayout on textField
self.textField.setNeedsLayout()
self.textField.layoutIfNeeded()

// add constraints now 

答案 1 :(得分:0)

覆盖func viewDidLayoutSubviews(){

    super.viewDidLayoutSubviews()

    diameterText.frame = CGRect(x: diameterLabel.frame.origin.x, y: diameterLabel.frame.origin.y + 10, width: view.frame.width - diameterLabel.frame.origin.x * 2, height: 35)

    heightText.frame = CGRect(x: heightlabel.frame.origin.x, y: heightlabel.frame.origin.y + 10, width: view.frame.width - heightlabel.frame.origin.x * 2, height: 35)
}

感谢它为我工作。