2017-09-13 1 views
1

Ich habe eine programmatische Ansicht mit einem Etikett darin, das ich an den unteren Rand der navBar hefte. Es wird dynamischen Text innerhalb des Labels geben und ich möchte, dass das Label mindestens 64 Punkte groß ist, wenn die Höhe des Textes es verkleinert.Swift iOS - Wie setze ich UIView's Height Anchor <= auf die intrinsische Textgröße eines Labels? "NSLayoutConstraint" ist nicht in "Bool" umwandelbar.

Die tatsächliche Größe des Textes von dieser Beschriftung legt die Ansicht in einer auffälligen Höhe fest.

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

enter image description here

jedoch die innere Größe dieses Textes die Höhe zu klein macht:

setViewAndLabel(dynamicText: "Message Deleted!") 

enter image description here

Die Nachricht gelöscht! sollte entlang der Linien von mehr sein:

enter image description here

habe ich einige Rückkehr Schlüssel setzen es so, aber ich glaube nicht, dass der richtige Weg, wird zu gehen, weil verschiedene Nachrichten generiert erhalten:

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

ich auch versucht:

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

Aber ich bekomme die Fehlermeldung:

'NSLayoutConstraint' is not convertible to 'Bool'

Wie wird die Höhe für die Ansicht, in der sich das Etikett befindet, am besten auf eine Mindesthöhe eingestellt?

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

Warum haben Sie die Einschränkung "weniger als oder gleich" verwendet, wenn Sie * mindestens * 64 haben möchten? Entweder verwenden Sie eine "gleiche" Einschränkung, wenn Sie immer 64 oder ein "größer als oder gleich" wollen, wenn Sie mindestens 64 wollen. – Paulw11

+0

@ Paulw11 danke für das hinweisend. Das ist aber nicht das Problem. Ich habe vergessen, den Fehler zu meiner Frage hinzuzufügen. Ich aktualisiere es jetzt. –

+0

@ Paulw11 danke für den Rat. Andre beantwortete die Frage und die Antwort war genau das, was du gesagt hast :) –

Antwort

2

Dies ist, wie Sie Ihre Einschränkungen eingerichtet haben:

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 

Sie brauchen nicht auf alle die Beschriftung der Höhe zu überprüfen. Sie können einfach immer Höhe größer als oder gleich Constraint für myView erstellen und seine Höhe wird nie kleiner als 64pt (oder was auch immer Wert Sie es einstellen) - auch wenn das Etikett einen sehr kurzen Text enthält.

+0

danke für die Hilfe! Arbeitete wie Charme :) –

Verwandte Themen