web-dev-qa-db-fra.com

Modifier la contrainte par programme Swift

J'ai le contrôleur de vue suivant dans mon storyboard:

 storyboard_mainVC

Il aura toujours 6 vues d'image qui sont, par défaut, égales en largeur et en hauteur. Chaque vue d'image est limitée à la vue d'ensemble avec: "des hauteurs égales" et un multiplicateur de 1/2.

Cependant, avant de charger des images à l'intérieur, j'ai lu une propriété qui me donne la hauteur souhaitée pour une image (la largeur ne sera jamais modifiée).

Donc, mon interface (au moment de l'exécution) peut ressembler à ceci:

 second_interface

Je pense que j'ai besoin de modifier la constante du multiplicateur mais c'est read-only.

J'ai vu des publications disant que nous pouvons mettre à jour la propriété constant de la contrainte, mais que c'est en points, j'ai besoin que cela fonctionne sur tous les périphériques.

Maintenant que recommanderiez-vous? Dois-je supprimer la contrainte et en ajouter une nouvelle? Si je ne l'enlève pas et que j'essaie d'appliquer une nouvelle contrainte de hauteur, sera-t-elle automatiquement supprimée?

Dois-je utiliser des modules comme un composant logiciel enfichable pour faire le travail?

Merci de votre aide.

MODIFIER

Voici le code que j'ai essayé mais que je n'ai pas réussi: 

        for (index, (drawing, ratio)) in drawingElements.enumerate() {
            drawingViews[index].image = UIImage(named: drawing)
            // update height constraint if ratio is different than defaut ratio of 1/2
            if ratio != 0.5 {
                heightConstraints[index].active = false
                let newHeightConstraint = NSLayoutConstraint(item: drawingViews[index], attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.Height, multiplier: ratio, constant: 0)
                drawingViews[index].addConstraint(newHeightConstraint)
                self.view.layoutIfNeeded()
            }
        }

Est-ce que je me trompe? Je ne suis pas sûr de la nouvelle contrainte de hauteur

11
H4Hugo

Voici comment j'ai réalisé ceci: 

  • Créer une contrainte par programme (hauteur dans mon cas):

    // Drawing height property
    var drawingHeightConstraint: NSLayoutConstraint?
    
  • Désactive l'ancienne contrainte et définit la nouvelle si nécessaire

Remarque: heightContraints est un tableau de NSLayoutConstraint qui contient mes points de vente.

        for (index, (drawing, ratio)) in drawingElements.enumerate() {
        drawingViews[index].image = UIImage(named: drawing)

        // update height constraint if ratio is different than defaut ratio of 1/2
        if ratio != 0.5 {
            heightConstraints[index].active = false
            drawingHeightConstraint = NSLayoutConstraint(item: drawingViews[index], attribute: .Height, relatedBy: .Equal, toItem: drawingView, attribute: .Height, multiplier: CGFloat(ratio), constant: 0)
            drawingHeightConstraint!.active = true
        }

    }
  • Appelez layoutIfNeeded () juste après (remarque: vous ne savez pas quand l'appeler)
8
H4Hugo

Les constantes de contraintes sont liées au contenu de l'élément contraint ..__ C'est pourquoi vous obtenez un tel écran. Le moyen le plus simple - créer une image avec une couleur claire et la définir par défaut. Une fois le téléchargement terminé, définissez une nouvelle image pour votre imageView. 

Ou vous pouvez définir IBOutlet pour votre contrainte de hauteur - et la changer pour différentes situations

if(download.completed)
ibHeightOutlet.constant = imageView.frame.size.height;
else
ibHeightOutlet.constant = initialImageViewHeght.frame.size.height;
4
Karaban

Vous ne pouvez pas modifier le multiplicateur pour des raisons inconnues de moi (probablement une sorte de détail de la mise en œuvre d’Apple). Vous pouvez toutefois supprimer une contrainte et en créer une nouvelle. Vous devez supprimer l'ancienne contrainte, car elle ne sera pas supprimée automatiquement, et vous obtiendrez un conflit. Vous pouvez également créer la première contrainte (avec le multiplicateur 0.5) avec une priorité inférieure. De cette façon, vous pourriez le garder (l'autolayout l'ignorerait), mais je ne pense pas que ce soit une solution, car pourquoi auriez-vous besoin de cette contrainte inutile? Supprimez-le simplement… .. En ce qui concerne les moteurs de mise en page et les bibliothèques tiers, je ne peux malheureusement pas vous donner de conseil.

0
FreeNickname