2017-08-17 2 views
0

Mon contrôleur de vue possède un NSView que j'utilise en tant que conteneur. J'ai fait glisser la "Vue Conteneur" de la bibliothèque, supprimé le contrôleur de vue et embarqué, ajouté des contraintes à la vue supérieure (voir la vue principale du contrôleur) et mis en place une vue dans le conteneur.Affichage de conteneur dans Cocoa, échange de contenu au moment de l'exécution et conservation de la taille

Jusqu'ici tout va bien.

Je souhaite permuter le contenu de la vue conteneur avec la vue principale de plusieurs contrôleurs de vue différents, déterminée lors de l'exécution. J'ai réussi à le faire, avec le code comme ceci:

func swapContainerViewContents(with viewController: NSViewController) { 
    self.containerView.subviews.foreach({ subview in 
     subview.removeFromSuperview() 
    }) 

    containerView.addSubview(viewController.view) 
} 

Cela fonctionne, mais dès que je redimensionnez la fenêtre, la vue enfant reste évidemment à sa taille d'origine (je n'ai pas mis en place aucune contrainte) .

Si, au contraire, j'ajouter les contraintes nécessaires:

let newView = viewController.view 

containerView.addSubview(newView) 

newView.leftAnchor.constraint(equalTo: containerView.leftAnchor).isActive = true 
newView.rightAnchor.constraint(equalTo: containerView.rightAnchor).isActive = true 
newView.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true 
newView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor).isActive = true 

... maintenant, la fenêtre ne peut pas être redimensionnées! (il est bloqué à la taille initiale de la sous-vue).

Quelle est la façon de faire cela?

Répondre

0

Il se trouve tout ce que je devais faire est d'ajouter cette ligne avant de mes contraintes:

newView.translatesAutoresizingMaskIntoConstraints = false 

Il est clair pour moi pourquoi je devrais besoin de cela, étant donné que la vue des enfants je veux ajouter appartient à un contrôleur de vue créé à partir d'un storyboard (et ceux-ci sont censés déjà pas traduire le masque autoresizing en contraintes ...?); ce code ne devrait être nécessaire que pour les vues créées par programmation ...