2017-09-13 31 views
1

我有一个编程视图,里面有一个标签,我固定在navBar的底部。标签内部会有动态文本,如果文本的高度变得更小,我希望标签所在的视图至少为64点或更大。Swift iOS - 如何设置UIView的高度锚点<=标签的内在文本大小? 'NSLayoutConstraint'不能转换为'Bool'

此标签中文本的固有尺寸将视图设置在明显的高度。

setViewAndLabel(dynamicText: "Unknown Error\nPlease try your request again\Error: 123") 

enter image description here

然而这个文本的内在尺寸使得高度小:

setViewAndLabel(dynamicText: "Message Deleted!") 

enter image description here

留言删除!应该更多的线沿线:

enter image description here

我使用了一些回报键来设置它这样的,但我不认为这是去,因为不同的信息会产生正确的方法:

setViewAndLabel(dynamicText: "\nMessage Deleted!\n") 

我也试过:

if myView.heightAnchor.constraint(lessThanOrEqualToConstant: 64){ 
    myView.heightAnchor.constraint(equalToConstant: 64).isActive = true 
} 

但我得到的错误:

'NSLayoutConstraint' is not convertible to 'Bool'

什么是最好的方式来设置视图的高度标签是在一个最小的高度?

var myLabel: UILabel(){ 
    let label = UILabel() 
    label.translatesAutoresizingMaskIntoConstraints = false 
    label.textColor = UIColor.white 
    label.font = UIFont(name: "Helvetica-Regular", size: 19) 
    label.numberOfLines = 0 
    label.sizeToFit() 
    label.textAlignment = .center 
    return label 
} 

let myView:UIView = { 
    let view = UIView() 
    view.translatesAutoresizingMaskIntoConstraints = false 
    return view 
}() 

override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated){ 

    setViewAndLabel(dynamicText: //some text will get set here) 
} 

func setViewAndLabel(dynamicText: String){ 
    view.addSubView(myView) 
    myView.backgroundColor = UIColor.red 
    myView.topAnchor.constraint(equalTo: view.topAnchor, constant: 64).isActive = true 
    View.widthAnchor.constraint(equalTo: view.widthAnchor, constant: 0).isActive = true 

    myView.addSubView(myLabel) 
    myLabel.text = dynamicText 
    myLabel.topAnchor.constraint(equalTo: myView.topAnchor, constant: 0).isActive = true 
    myLabel.widthAnchor.constraint(equalTo: myView.widthAnchor, constant: 0).isActive = true 
    myView.bottomAnchor.constraint(equalTo: myLabel.bottomAnchor, constant: 0).isActive = true 

    //this if statement doesn't work 
    if myView.heightAnchor.constraint(lessThanOrEqualToConstant: 64){ 
     viewForErrorLabel.heightAnchor.constraint(equalToConstant: 64).isActive = true 
    } 
} 
+2

如果您希望它至少* 64,您为什么使用“小于或等于”约束?如果你总是想要64,或者使用“等于”约束,或者如果你想要至少64,那么使用“大于或等于”。 – Paulw11

+0

@ Paulw11谢谢指出。尽管这不是问题。我忘了添加它对我的问题所说的错误。我正在更新它。 –

+0

@ Paulw11谢谢你的建议。安德烈回答了这个问题,答案正是你所说的那样:) –

回答

2

这就是你必须设置你的约束:

view.addSubview(myView) 
myView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor).isActive = true 
myView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true 
myView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true 

myView.heightAnchor.constraint(greaterThanOrEqualToConstant: 64).isActive = true 

myView.addSubview(myLabel) 
myLabel.topAnchor.constraint(equalTo: myView.topAnchor).isActive = true 
myLabel.leadingAnchor.constraint(equalTo: myView.leadingAnchor).isActive = true 
myLabel.trailingAnchor.constraint(equalTo: myView.trailingAnchor).isActive = true 
myLabel.bottomAnchor.constraint(equalTo: myView.bottomAnchor).isActive = true 

你并不需要在所有的检查标签的高度。你可以简单地创建高度大于或等于的约束,并且其高度永远不会小于64pt(或任何你设置的值) - 即使标签包含非常短的文本。

+0

感谢您的帮助!像魅力一样工作:) –

相关问题