我正在创建一个将图像添加到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'而终止应用, 原因:'无法使用锚点激活约束 和 因为他们没有 共同祖先。约束或其锚点是否引用项目 在不同的视图层次结构?这是非法的。'
如果我不添加任何约束,那么视图就像这样
这是我想要实现的图像
答案 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)
}
<强>更新强>
根据请求只使用约束,让我们看一下leftView
与UITextField
的合作方式。
从实验开始,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)
}
感谢它为我工作。