objective-c ios foundation core-foundation cgfloat

objective c - ¿Hay una constante para el valor máximo de CGFloat?



objective-c ios (8)

¿Qué hay de CGFLOAT_MAX ?

Necesito crear un CGSize para calcular la altura del texto de un texto arbitrario con una longitud arbitraria. UIKit tiene este lindo método -sizeWithFont: constrainedToSize: y mi texto solo está limitado en ancho, pero no en alto.

Para esto, necesito establecer el máximo posible CGFloat para la altura.

¿Hay una constante como "CGFloatMax"?


En Swift 3.0, también puede usar CGFloat (FLT_MAX), especialmente si desea usarlo en otros casos como zIndex, donde CGFloat.greatestFiniteMagnitude estará fuera de rango.


Estaba buscando una versión Swift del valor mínimo de CGFloat y aterrizado aquí, si tú también;) entonces aquí está la respuesta:

CGFloat.leastNormalMagnitude


Esto es más un comentario que una respuesta; sin embargo, no tengo suficiente reputación para comentar en el presente.

Me encontré con un comportamiento inesperado con el uso de CGFLOAT_MAX: en un dispositivo iPhone 5S (64 bits) con iOS 7.1.2 y con Xcode 5.1.1, el siguiente código:

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

Productos:

numRot = inf

Considerando que, este código:

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

Correctamente salidas:

numRot: 945228740662580166143622731901435904.00

Cometí + hice clic en CGFLOAT_MAX y Xcode me llevó al archivo CGBase.h de los marcos de CoreGraphics con la siguiente definición de macro:

# define CGFLOAT_MAX DBL_MAX

Yo comando + clic en CGFloat y Xcode me llevó a otra línea en el mismo archivo:

typedef CGFLOAT_TYPE CGFloat;

Luego ordeno + hago clic en CGFLOAT_TYPE y saltó a la línea #define aquí:

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

Entonces, por alguna razón, mi variable CGFloat se supone que es un doble, sin embargo, parece ser un flotante que se desborda cuando se le asigna un valor doble (es decir, CGFLOAT_MAX). Por lo que puedo decir, esta página de documentación de Apple indica que al usar% f con NSLog debería imprimir el doble, que alguien me corrija si esto es incorrecto.

Todo eso para decir, si FLT_MAX funciona para su caso, es posible que desee continuar con eso por el momento en lugar de CGFLOAT_MAX, especialmente si confía en una biblioteca que acepte específicamente los argumentos de flotación en lugar de doble o CGFloat.


Para aquellos que usan Swift 2, debes usar:

CGFloat.max

Para aquellos que usan Swift 3, debes usar:

CGFloat.greatestFiniteMagnitude

Tenga en cuenta que CGFloat.max se eliminó cuando salió Swift 3, como se refleja en la documentation .


Un CGFloat es solo un float para que pueda usar FLT_MAX de manera FLT_MAX desde <float.h> .

EDITAR: Como otros han señalado, parece que CGFLOAT_MAX ya está definido para usted, por lo que debe usarlo para mayor coherencia en lugar de FLT_MAX , aunque son lo mismo en las plataformas de 32 bits.



CGSize size = CGSizeMake(CGFLOAT_MIN, CGFLOAT_MAX);

ancho = 0.0000000000000000000000000000000000000117549435, altura = 3.40282347E + 38