web-dev-qa-db-fra.com

La définition du cadre d'une UIView ne fonctionne pas

J'ai un problème avec la propriété frame dans iOS 7. Je veux redimensionner certains UIViews dans la méthode viewDidLoad- de mon UIViewController, mais si je le fais comme int screenHeight = [[UIScreen mainScreen] bounds].size.height; [self.leftSideTableView setFrame: CGRectMake(0, 0, 320, screenHeight)]; la hauteur est réglée comme je le veux jusqu'à la fin de la méthode, mais dans toutes les autres méthodes, elle est comme avant!

Quel est le problème ou est-ce juste un bug du compilateur ou autre chose?

21
MyJBMe

Il faut mettre le redimensionnement de la vue dans -viewDidLayoutSubviews:! (documentation)

Le placement du cadre de vue se transforme en -viewWillAppear: ou -viewDidLoad: ne fonctionnera pas, car les vues ne sont pas encore disponibles!

73
MyJBMe
  • Vérifiez si vous utilisez autolayout dans votre fichier xib. Si vous ne souhaitez pas utiliser autolayout, décochez-le dans votre fichier xib.

  • Change ton self.leftSideTableView cadre dans -viewWillAppear:.

11
liuyaodong

Vérifiez que la mise en page automatique n'est pas activée dans votre fichier de storyboard.

Pour le désactiver, regardez l'inspecteur dans le générateur d'interface. Cliquez sur l'icône qui ressemble à une page tout à gauche. Dans la section "Document Interface Builder", décochez "Utiliser la mise en page automatique".

Je trouve qu'il est préférable d'avoir un contrôleur de vue complet dans IB avec une mise en page automatique ou complètement en code. Le mélange des deux peut conduire à un comportement étrange difficile à déboguer.

8
lancejabr

Il y a plusieurs raisons pour lesquelles cela pourrait se produire. Tout d'abord, vous devez vous assurer que votre vue de table n'est pas nulle. Si vous le créez par programme, vous devez être sûr d'appeler alloc/init quelque part avant d'essayer de définir le cadre. Si self.leftSideTableView est une IBOutlet, cela peut être dû à l'oubli de lier réellement la sortie à l'objet d'interface.

Ensuite, deuxième et moins probable, vous créez la vue de table par programme et l'initialisez correctement, mais vous avez oublié de l'ajouter en tant que sous-vue de l'une de vos vues à l'écran.

1
Mick MacCallum