2016-10-24 4 views
0

Ich habe ein Storyboard wie im Bild erstellt. Da ich den vertikalen Abstand zwischen der roten Ansicht und dem TableView auf ca. 20 eingestellt habe, funktioniert das gut. Constraints nicht automatisch in ios

Aber wenn ich versuchte, die Höhe der roten Ansicht zu ändern, dann sollte die Tabellenansicht mit den Einschränkungen kommen, die ich hinzugefügt habe, aber die Tabellenansicht ist an der gleichen Stelle konstant geblieben.

habe ich den folgenden Code

redView.frame.size = CGSize(width: 1008, height: 0) 
self.view.layoutIfNeeded() 
+0

Können Sie zeigen, welche anderen Einschränkungen Sie der roten Ansicht und dem TableView gegeben haben? –

+0

Haben Sie die Höhe von redView gleich der Höhe der Ansicht? Und Sie ändern die Höhe des redView auf 0? –

Antwort

0

Sie Automatische Anordnung verwendet werden, sollte die RedView Höhe zu manipulieren. Ändern der Bildgröße ist nicht automatisches Layout. Ändern Sie ihre Höhenbeschränkung (falls vorhanden)

0

Sie müssen entweder Einschränkungen oder Änderungen an Frames verwenden! Du kannst nicht beides!

Sie müssen einen Auslassverweis auf Ihre Bedingung erstellen und stattdessen deren Konstantenwert ändern.

0

Wenn Sie den Code in viewdidload oder viewwillappear platziert haben, werden Sie Probleme wie diese finden. Sie müssen den Code nach dem Laden aller Constraints einfügen.

Machen Sie auch ein Objekt der Höhenbeschränkung und benennen Sie es zum Beispiel redViewHeight. und ändern Sie ihren Wert von: redViewHeight.constant = 0

Es wird funktionieren!

+0

Mein Code ist in viewDidAppear() und ich habe den angegebenen Code ausprobiert –

+0

haben Sie proportionale Höhe zwischen redview und mainview verwendet? –

+0

löschen Sie diese Proportionalitätseinschränkung und fügen Sie eine Konstantenhöheneinschränkung hinzu. dann machen Sie einen Ausgang dieser konstanten Höhenbeschränkung für zB: redViewHeight. Setzen Sie redViewHeight.constant = 0, wo Sie wollen. und für andere Fälle setzen Sie redViewHeight.constant = Proportionalitätsverhältnis * screenHeight. wo screenHeight = [UIScreen mainScreen] .bounds.size.height –

0

Ersetzen Sie die Einschränkungen für die Ansichten durch die folgenden.

  1. Redview

    Top constraint to ParentView
    Leading Constraint to ParentView
    Trailing constraint to ParentView
    Height Constraint

  2. Tableview

    Top constraint to RedView
    Leading Constraint to ParentView
    Trailing constraint to ParentView
    Bottom constraint to ParentView

Jetzt eine IBOutlet für die HeightConstraint von RedView verdrahten und seine constant Wert ändern. Die UITableView wird ihre Höhe wie gewünscht einstellen.

0

Immer wenn Sie einem Objekt auf dem Storyboard eine Abhängigkeit hinzufügen, wird der Rahmen dieses Objekts von der Auto-Layout-Engine beibehalten. Dies ist das primäre Konstruktionsprinzip, denke ich. In diesem Fall können Sie einfach eine Steckdose der gewünschten Einschränkung erstellen, die Sie aktualisieren und diese Einschränkung in Ihrem Code aktualisieren möchten. Zu deinem Verständnis füge ich einen Screenshot bei.

enter image description here

Jetzt, nach einem Zwangs Steckdose macht es so aussehen wie muss wie folgt.

@IBOutlet weak var containerViewHeight: NSLayoutConstraint! 

Jetzt, um die Höhe zu aktualisieren, müssen Sie nur eine Sache tun.

containerViewHeight.constant = 0 

Meiner Meinung nach, ob dieses Update nicht in viewDidLoad oder viewWillAppear funktioniert dann bitte innerhalb viewDidLayoutSubviews aktualisiert werden, da, wenn viewDidLoad dann aufgerufen iOS nicht das Layout richtig anzuwenden.

In meinem Fall, was ich tun, ist -

override func viewDidLayoutSubviews() { //This ensures all the layout has been applied properly. 
    super.viewDidLayoutSubviews() 
    containerViewHeight.constant = 0 
} 

Hinweis: - Um einige schöne Animationseffekt während des Layouts zu erzielen Änderungen, die Sie wie diese Einschränkung Update innerhalb eines UIView Animationsblock wie folgt anwenden können. Aber denken Sie daran, den Effekt zu sehen schön haben Sie dies rufen, nachdem die Ansicht richtig wie nach viewDidAppear präsentieren usw.

UIView.animateWithDuration(1.0, delay: 0.2, usingSpringWithDamping: 8.0, initialSpringVelocity: 1.0, options: UIViewAnimationOptions.CurveEaseIn, animations: { 
    containerViewHeight.constant = 0 
    self.view.layoutIfNeeded() 
}, completion: nil) 

Sorry für etwaige Fehler. Update/Edit ist sehr willkommen.

Hoffe das half. Danke