2017-09-13 70 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

感謝您的幫助!像魅力一樣工作:) –

相關問題