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"?
CGGeometry définit:
#define CGFLOAT_MAX FLT_MAX
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 .
Que diriez-vous de CGFLOAT_MAX
?
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.
Je cherchais une version Swift de minimum CGFloat et atterris ici, si vous aussi;) alors voici la réponse:
CGFloat.leastNormalMagnitude
CGSize size = CGSizeMake(CGFLOAT_MIN, CGFLOAT_MAX);
width = 0.000000000000000000000000000000000000001104949435, height = 3.40282347E + 38
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.
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.