2017-02-13 1 views
0

J'ai une vue que je fais cachée en bas de l'écran, et je veux que le scrollView au-dessus d'elle s'ajuste et remplisse l'espace vide.Swift: les vues ne s'ajustent pas aux contraintes programmatiques

La vue en bas de l'écran est un GADBannerView et a une hauteur fixe de 50 (bannerHeight). La vue de défilement au-dessus a une contrainte au fond du conteneur qui est égale à 50 (scrollConstraint). Regarde la photo.

enter image description here

En viewDidLoad am La définition de ces contraintes sur les points suivants:

bannerHeight.constant = 0 
scrollConstraint.constant = 0 

Cela provoque la BannerView ne disparaît mais la vue de défilement est de rester dans sa position d'origine et ne pas remplir l'espace vide .

+0

J'ai 2 suggestions: essayez de mettre votre code viewWillAppear et assurez-vous translatesAutoresizingMaskIntoConstraints = false pour les bannières et faites défiler des vues. Parfois, les contraintes ne sont pas entièrement calculées dans viewDidLoad. – Ocunidee

+0

Vous devez utiliser 'bannerHeight.constant' comme valeur pour' scrollConstraint.constant'. –

Répondre

1

Vous pouvez forcer la vue supérieure à prendre en compte la modification de la contrainte, car cela ne se produit pas automatiquement. Ajoutez votre code à viewDidLayoutSubviews() à la place ou appelez simplement view.layoutIfNeeded() après avoir défini les constantes à 0 dans viewDidLoad().

Si cela ne fonctionne pas, vous pouvez essayer cette approche alternative:

Allez à votre Storyboard et cliquez sur la contrainte en bas de la vue de défilement (la ligne bleue qui donne le défilement sa contrainte inférieure de 50). Dans les attributs de l'inspecteur, vous devriez être en mesure de voir les détails au sujet de votre contrainte, il devrait ressembler à ceci

Attributes Inspector

Dans le champ qui demande un identificateur, donnez-lui le nom « ScrollViewBottom » ou quel que soit le nom que vous comme.

boucle maintenant sur toutes les contraintes qui composent votre point de vue de défilement et utiliser le nom d'identifiant pour trouver le bon et le changer est constant comme suit

for constraint in yourScrollView.superview!.constraints { 

if constraint.identifier == "ScrollViewBottom" { 
    constraint.constant = 0 
} 
} 

Enfin, la force en vue de tenir compte de cette changement en appelant la ligne droite qui suit après

view.layoutIfNeeded()