web-dev-qa-db-fra.com

Comment définir la taille UIView pour qu'elle corresponde au parent sans contraintes par programme

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.

enter image description here

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)

enter image description here

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.

13
Seifolahi

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 newViews 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)

  • Définissez un masque de redimensionnement automatique pour newView
21
Shadow Of

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

20
Vic

Essaye ça

subview.frame = parentView.bounds

subview.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]

parentView.addSubview(subview)

9
Cjay

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.

3
Lion

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.

2
Nirav D

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.

1
Ccr

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.)

0
Duncan C

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

0
shubh14896

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)
0