Ответ 1
CGGeometry определяет:
#define CGFLOAT_MAX FLT_MAX
Мне нужно создать CGSize для вычисления высоты текста произвольного текста с произвольной длиной. UIKit имеет этот хороший метод -sizeWithFont: constrainedToSize: и мой текст ограничивается только шириной, но не высотой.
Для этого мне нужно установить максимально возможный CGFloat для высоты.
Есть ли константа типа "CGFloatMax"?
CGGeometry определяет:
#define CGFLOAT_MAX FLT_MAX
Для тех, кто использует Swift 2, вы должны использовать:
CGFloat.max
Для тех, кто использует Swift 3, вы должны использовать:
CGFloat.greatestFiniteMagnitude
Обратите внимание, что CGFloat.max
был удален, когда появился Swift 3, что отражено в документации .
Как насчет CGFLOAT_MAX
?
A CGFloat
- это просто float
, поэтому вы можете безопасно использовать FLT_MAX
из <float.h>
.
EDIT: Как уже указывали другие, похоже, что CGFLOAT_MAX
уже определен для вас, поэтому вы должны использовать это для согласованности, а не FLT_MAX
, хотя они одинаковы на 32-битных платформах.
Я искал Swift версию минимум CGFloat и приземлился здесь, если вы тоже;), то вот ответ:
CGFloat.leastNormalMagnitude
Это скорее комментарий, чем ответ, но у меня нет достаточной репутации для комментариев в настоящее время.
Я просто столкнулся с неожиданным поведением с использованием CGFLOAT_MAX: на iPhone 5S (64-битное) устройство под управлением iOS 7.1.2 и используя Xcode 5.1.1, следующий код:
CGFloat numRot = floorf(CGFLOAT_MAX / 360.0);
NSLog(@"numRot = %.2f", numRot);
Выходы:
numRot = inf
В то время как этот код:
CGFloat numRot = floorf(FLT_MAX / 360.0);
NSLog(@"numRot = %.2f", numRot);
Правильно выдает:
numRot: 945228740662580166143622731901435904.00
Я команду + нажал на CGFLOAT_MAX и Xcode взял меня в файл CGBase.h фреймворка CoreGraphics со следующим определением макроса:
# define CGFLOAT_MAX DBL_MAX
Я команду + нажал на CGFloat, и Xcode взял меня в другую строку в том же файле:
typedef CGFLOAT_TYPE CGFloat;
Затем я команду + нажал на CGFLOAT_TYPE, и он перешел в строку #define здесь:
#if defined(__LP64__) && __LP64__
# define CGFLOAT_TYPE double
...
Итак, по какой-то причине моя переменная CGFloat должна быть двойной, однако она выглядит как float, которая переполняется, когда ей присваивается двойное значение (т.е. CGFLOAT_MAX). Насколько я могу судить эта страница документации Apple указывает, что использование% f с NSLog должно печатать двойное - кто-то, пожалуйста, исправьте меня, если это не так.
Все, что сказать, если FLT_MAX работает для вашего случая, вы можете придерживаться этого на данный момент вместо CGFLOAT_MAX, особенно если вы полагаетесь на библиотеку, которая специально принимает аргументы float вместо double или CGFloat.
CGSize size = CGSizeMake(CGFLOAT_MIN, CGFLOAT_MAX);
width = 0.0000000000000000000000000000000000000117549435, height = 3.40282347E + 38
В Swift 3.0 вы также можете использовать CGFloat (FLT_MAX), особенно если вы хотите использовать его в других случаях, таких как zIndex, где CGFloat.greatestFiniteMagnitude будет вне диапазона.