Le problème semble facile mais ça me rend fou. J'ai créé une vue blanche dans IB qui s'appelle iBag et par contraintes sa taille dépend de la taille de l'écran.
Maintenant, je veux créer une nouvelle UIView par programme et l'ajouter comme sous-vue à iBag avec la même taille et la même position par ce code
let newView = UIView()
newView.frame = (frame: CGRect(x: 0, y: 0, width: iBag.frame.width, height: iBag.frame.height))
newView.backgroundColor = UIColor.redColor()
iBag.addSubview(newView)
J'ai aussi essayé des limites mais cela n'a pas aidé. Je peux utiliser des contraintes pour résoudre le problème mais je veux comprendre ce qui ne va pas.
Tant de réponses et personne n'explique ce qui ne va pas.
Je vais essayer.
Vous définissez le cadre de newView
sur votre cadre de superviews avant le moteur de mise en page automatique a commencé à déterminer la position et la taille de vos superviews. Ainsi, lorsque vous utilisez le cadre superviews
, vous utilisez son cadre initial. Ce qui n'est pas correct dans la plupart des cas.
Vous avez 3 façons de le faire correctement:
Utilisez les contraintes de mise en page automatique pour votre newView
Définissez le cadre newView
s dans la méthode viewDidLayoutSubviews
. Appelé lorsque le moteur de mise en page automatique a fini de déterminer les valeurs réelles des trames. (Remarque: cette méthode peut être appelée plusieurs fois)
newView
Essaye ça:
Swift 1 et 2:
newView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
Swift 3 +:
newView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
Si cela ne fonctionne pas, aussi ceci:
iBag.autoresizesSubviews = true
Essaye ça
subview.frame = parentView.bounds
subview.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
parentView.addSubview(subview)
Essaye ça,
override func viewDidLayoutSubviews() {
newView.frame = (frame: CGRect(x: 0, y: 0, width: iBag.frame.width, height: iBag.frame.height))
}
ou vous pouvez utiliser viewWillAppear
ou viewDidAppear
pour définir le cadre.
Parce que dans viewDidload
le cadre de votre iBag est le même que dans votre générateur d'interface (storyboard). Maintenant, cela changera en fonction de vos contraintes et de la taille de l'appareil sur lequel vous exécutez. Ainsi, dans viewDidload
, votre nouvelle vue obtient l'ancien cadre et non le cadre modifié. Il est donc préférable d'utiliser viewDidLayoutSubviews
ou viewWilAppear
.
Deuxième chose, Soit utiliser la mise en page automatique partout ou nulle part. C'est une mauvaise pratique d'utiliser la mise en page automatique dans la vue parent et non pour l'enfant.
Peut-être que cela vous aidera
override func viewDidLayoutSubviews() {
let newView = UIView()
newView.frame = iBag.bounds
newView.addConstraints(iBag.constraints)
newView.backgroundColor = UIColor.redColor()
iBag.addSubview(newView)
}
J'espère que ceci vous aidera.
peut-être que cela fonctionnera: -
subview.bounds.size = parentView.bounds.size
subview.center = parentView.center
mais dans votre cas, width
et height
à l'intérieur du CGRect devrait être
width: parentView.bounds.size.width
height: parentView.bounds.size.height
puis ajoutez à son parent en tant que sous-vue.
Ne pas utiliser de contraintes est probablement ce qui ne va pas. Si votre storyboard/nib est configuré pour utiliser la mise en page automatique (qui est activée par défaut), la définition des cadres/limites est remplacée par le système de mise en page automatique et vous DEVEZ utiliser des contraintes pour que votre mise en page soit correcte. (ou définissez l'indicateur qui convertit les masques de redimensionnement automatique en contraintes. Je ne me souviens pas de la façon dont cet indicateur est appelé et ne semble pas le trouver pour le moment.)
Si vous configurez votre vue dans viewdidload, appelez-la dans viewdidappear, afin qu'elle capture le cadre de vue d'origine, en fonction de la taille de l'écran
essayez ce code:
let newView = UIView()
newView.frame = (frame: CGRect(x: iBag.frame.Origin.x, y: iBag.frame.Origin.y, width: iBag.frame.size.width, height: iBag.frame.size.height))
newView.backgroundColor = UIColor.redColor()
iBag.addSubview(newView)