2016-11-23 2 views
1

Aus meiner Sicht ich dynamische Anzahl von UILabels wie diese haben werde:Set Einschränkungen in Code für eine dynamische Anzahl von Elementen

| HEADER | 
| - label | 
| - label | 
| - label | 
| ...  | 
| BUTTON | 

Ich baue Layout mit Einschränkungen für jedes Element in Code (mit Snap-Kit) wegen der dynamischen Anzahl der Etiketten. Angenommen, ich habe ein Array von Strings, für jeden String in einem Array erzeuge ich ein separates Label, füge es zu superview hinzu und positioniere es unterhalb des vorherigen. Ich bin mir jedoch nicht sicher, wie ich die Einschränkungen für diese Etiketten richtig festlege. Ich glaube, ich muss die for-Schleife schreiben, aber wie man erstes Etikett anheft, um an Kopfzeile zu haften, jede nächste, um an vorheriges Etikett zu haften und am Ende haftet der Knopf unter dem letzten Etikett?

header.snp.makeConstraints { (make) -> Void in 
     make.top.equalTo(self.view).offset(10) 
     make.leading.equalTo(self.view).offset(10) 
     make.trailing.equalTo(self.view).offset(10) 
    } 

    for object in objects { 
     let label = UILabel() 
     label.text = object 
     self.view.addSubview(label) 

     // and here how to set correct constraints for each label? 
    } 

    button.snp.makeConstraints { (make) -> Void in 
     make.leading.equalTo(self.view).offset(10) 
     make.trailing.equalTo(self.view).offset(10) 
     make.bottom.equalTo(self.view).offset(10) 
    } 

Es ist das erste Mal, dass ich alle Einschränkungen im Code schreibe, also tut mir leid, wenn das wie dumme Frage klingen mag. Danke für die Hilfe.

Antwort

1

Sie könnten eine Variable vor der for Schleife zu aktuellen Ansicht zu verfolgen. Am Anfang würde es Header zeigen und dann aktualisiert bei jeder Iteration in der Schleife:

var topView = header 
for object in objects { 
    let label = UILabel() 
    label.text = object 
    self.view.addSubview(label) 

    // and here are your constraints 
    label.top.equalTo(topView).offset(10) 
    label.left.equalTo(self.view).offset(20) 

    // topView is now the current label 
    topView = label 
} 

button.snp.makeConstraints { (make) -> Void in 
    make.leading.equalTo(self.view).offset(10) 
    make.trailing.equalTo(self.view).offset(10) 
    make.top.equalTo(topView).offset(10) 
    make.bottom.equalTo(self.view).offset(10) 
} 

Wenn Ihre Etikett gleichen Abstand haben dann mehr bevorzugte Art und Weise ist UIStackView zu versuchen. Sie deklarieren eine Stapelansicht, geben Einschränkungen dafür an, und dann fügen Sie in der for-Schleife einfach durch stackView.addArrangedSubview(label)

+0

Danke. So einfach. – Bastek

0

Verwenden Sie eine vertikale Stapelansicht. Es wird Ihr Leben einfacher machen (UIStackView Dokumentation here)

Verwandte Themen