36 votes

Avoir du mal à faire en sorte que UIView sizeToFit fasse quelque chose de significatif

Quand j'ajoute une sous-vue à un UIView, ou quand je le redimensionnement d'un existant sous-vue, je m'attends [view sizeToFit] et [view sizeThatFits] afin de refléter ce changement. Cependant, mon expérience est qu' sizeToFit ne fait rien, et sizeThatFits renvoie la même valeur avant et après le changement.

Mon projet de test a une vue unique qui contient un seul bouton. En cliquant sur le bouton ajoute un autre bouton de la vue, puis les appels sizeToFit sur le contenant de vue. Les limites de la vue sont sous-évaluées à la console avant et après l'ajout de la sous-vue.

- (void) logSizes {
 NSLog(@"theView.bounds: %@", NSStringFromCGRect(theView.bounds));
 NSLog(@"theView.sizeThatFits: %@", NSStringFromCGSize([theView sizeThatFits:CGSizeZero])); 
}

- (void) buttonTouched { 
 [self logSizes];
 UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
 btn.frame = CGRectMake(10.0f, 100.0f, 400.0f, 600.0f);
 [theView addSubview:btn];
 [theView sizeToFit];
 [self performSelector:@selector(logSizes) withObject:nil afterDelay:1.0];
}

Et la sortie est:

2010-10-15 15:40:42.359 SizeToFit[14953:207] theView.bounds: {{0, 0}, {322, 240}}
2010-10-15 15:40:42.387 SizeToFit[14953:207] theView.sizeThatFits: {322, 240}
2010-10-15 15:40:43.389 SizeToFit[14953:207] theView.bounds: {{0, 0}, {322, 240}}
2010-10-15 15:40:43.391 SizeToFit[14953:207] theView.sizeThatFits: {322, 240}

Quelque chose doit m'échapper d'ici.

Merci.

51voto

Ole Begemann Points 85798

La documentation est assez clair sur ce point. -sizeToFit assez bien les appels -sizeThatFits: (probablement avec la vue actuelle de la taille de l'argument), et l'implémentation par défaut de -sizeThatFits: fait presque rien (elle retourne son argument).

Certains UIView sous-classes remplacer -sizeThatFits: faire quelque chose de plus utile (par exemple, UILabel). Si vous souhaitez que tous les autres fonctionnalités (telles que le redimensionnement d'une vue à la taille de ses sous-vues), vous devez sous-classe UIView et remplacer -sizeThatFits:.

0voto

marmor Points 4559

Vous pouvez faire d'autres comme ça à l'aide de l'IB seul (xcode 4.5):

  1. Cliquez sur l' UIView
  2. dans la Taille de l'inspecteur de glisser - content hugging à 1 (à la fois horizontale et verticale)
  3. faites glisser compression resistance à 1000 (pour les deux)
  4. en vertu de la UIView de l' constraints cliquez sur Width et variation priority à 250
  5. Faire de même pour la Hauteur
  6. Vous pouvez utiliser l' UIViews' inset de contrôle de remplissage pour la gauche/droite/haut/bas

0voto

shaunlim Points 691
         self.errorMessageLabel.text = someNewMessage;

    // We don't know how long the given error message might be, so let's resize the label + containing view accordingly
    CGFloat heightBeforeResize = self.errorMessageLabel.frame.size.height;

    [self.errorMessageLabel sizeToFit];

    CGFloat differenceInHeightAfterResize = self.errorMessageLabel.frame.size.height - heightBeforeResize;

    self.errorViewHeightContstraint.constant = kErrorViewHeightConstraintConstant + differenceInHeightAfterResize;
 

Cela a fonctionné pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X