web-dev-qa-db-fra.com

Existe-t-il une constante pour la valeur maximale de CGFloat?

J'ai besoin de créer un CGSize pour calculer la hauteur de texte d'un texte arbitraire avec une longueur arbitraire. UIKit a cette méthode agréable -sizeWithFont: constrainedToSize: et mon texte est uniquement contraint en largeur mais pas en hauteur.

Pour cela, je dois définir le maximum possible de CGFloat pour la hauteur.

Existe-t-il une constante du type "CGFloatMax"?

47
Proud Member

CGGeometry définit:

#define CGFLOAT_MAX FLT_MAX
41

Pour ceux qui utilisent Swift 2, vous devez utiliser:

CGFloat.max

Pour ceux qui utilisent Swift 3, vous devez utiliser:

CGFloat.greatestFiniteMagnitude

Notez que CGFloat.max a été supprimé lors de la sortie de Swift 3, comme indiqué dans documentation .

161
GBF_Gabriel

Que diriez-vous de CGFLOAT_MAX ?

13
Josh Caswell

Une CGFloat est juste une float afin que vous puissiez utiliser en toute sécurité FLT_MAX à partir de <float.h>.

EDIT: Comme d’autres l’ont déjà fait remarquer, il semblerait que CGFLOAT_MAX soit déjà défini pour vous; vous devriez donc l’utiliser pour la cohérence plutôt que FLT_MAX, même s’ils sont identiques sur les plates-formes 32 bits.

5
Paul R

Je cherchais une version Swift de minimum CGFloat et atterris ici, si vous aussi;) alors voici la réponse:

CGFloat.leastNormalMagnitude
4
AamirR
CGSize size = CGSizeMake(CGFLOAT_MIN, CGFLOAT_MAX);

width = 0.000000000000000000000000000000000000001104949435, height = 3.40282347E + 38

1
Rajan Twanabashu

C'est plus un commentaire qu'une réponse, mais je n'ai pas assez de réputation pour commenter pour le moment.

Je viens de rencontrer un comportement inattendu lors de l'utilisation de CGFLOAT_MAX: sur un périphérique iPhone 5S (64 bits) exécutant iOS 7.1.2 et utilisant Xcode 5.1.1, le code suivant:

CGFloat numRot = floorf(CGFLOAT_MAX / 360.0);
NSLog(@"numRot = %.2f", numRot);

Les sorties:

numRot = inf

Considérant que ce code:

CGFloat numRot = floorf(FLT_MAX / 360.0);
NSLog(@"numRot = %.2f", numRot);

Affiche correctement:

numRot: 945228740662580166143622731901435904.00

J'ai commandé + cliqué sur CGFLOAT_MAX et Xcode m'a conduit au fichier CGBase.h des frameworks CoreGraphics avec la définition de macro suivante:

# define CGFLOAT_MAX DBL_MAX

J'ai commandé + cliqué sur CGFloat et Xcode m'a amené à une autre ligne dans le même fichier:

typedef CGFLOAT_TYPE CGFloat;

Ensuite, j'ai commandé + cliqué sur CGFLOAT_TYPE et il a sauté à la ligne #define ici:

#if defined(__LP64__) && __LP64__
# define CGFLOAT_TYPE double
...

Donc, pour une raison quelconque, ma variable CGFloat est supposée être un double, mais il semble qu’il s’agisse d’un flottant qui déborde quand on lui attribue une valeur double (c'est-à-dire CGFLOAT_MAX). Autant que je sache cette page de documentation Apple indique que l'utilisation de% f avec NSLog devrait imprimer le double - quelqu'un, s'il vous plaît, corrigez-moi si cela ne va pas.

Tout cela pour dire que si FLT_MAX fonctionne pour votre cas, vous voudrez peut-être rester avec cela pour l'instant au lieu de CGFLOAT_MAX, en particulier si vous vous basez sur une bibliothèque qui accepte spécifiquement les arguments flottants au lieu de double ou CGFloat.

1
Leo Thiessen

Dans Swift 3.0, vous pouvez également utiliser CGFloat (FLT_MAX), surtout si vous souhaitez l’utiliser dans d’autres cas, comme zIndex, où CGFloat.greatestFiniteMagnitude sera hors de portée.

0
Anson Yao