Есть ли константа для максимального значения CGFloat? - PullRequest
50 голосов
/ 09 июня 2011

Мне нужно создать CGSize для вычисления высоты текста произвольного текста с произвольной длиной.У UIKit есть этот хороший метод -sizeWithFont: constrainedToSize: и мой текст ограничен только по ширине, но не по высоте.

Для этого мне нужно установить максимально возможный CGFloat для высоты.

Есть ли такая константа, как "CGFloatMax"?

Ответы [ 8 ]

169 голосов
/ 04 октября 2014

Для тех, кто использует Swift 2, вы должны использовать:

CGFloat.max

Для тех, кто использует Swift 3, вы должны использовать:

CGFloat.greatestFiniteMagnitude

Обратите внимание, что CGFloat.max был удален, когда Swift3 вышли, как это отражено в документации .

41 голосов
/ 09 июня 2011

CGGeometry определяет:

#define CGFLOAT_MAX FLT_MAX
13 голосов
/ 09 июня 2011

Как насчет CGFLOAT_MAX?

5 голосов
/ 09 июня 2011

A CGFloat - это просто float, поэтому вы можете безопасно использовать FLT_MAX из <float.h>.

РЕДАКТИРОВАТЬ: Как уже отмечали другие, похоже, что CGFLOAT_MAX уже определено дляВам следует использовать это для согласованности, а не FLT_MAX, даже если они одинаковы на 32-битных платформах.

3 голосов
/ 08 августа 2017

Я искал версию Swift минимальное значение CGFloat и приземлился здесь, если вы тоже;), вот ответ:

CGFloat.leastNormalMagnitude
1 голос
/ 04 ноября 2015
CGSize size = CGSizeMake(CGFLOAT_MIN, CGFLOAT_MAX);

ширина = 0,0000000000000000000000000000000000000117549435, высота = 3,40282347E + 38

1 голос
/ 09 июля 2014

Это скорее комментарий, чем ответ, однако у меня недостаточно репутации, чтобы комментировать в настоящее время.

Я только что столкнулся с неожиданным поведением при использовании 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, особенно если вы полагаетесь на библиотеку, которая специально принимает аргументы с плавающей точкой вместо double или CGFloat.

0 голосов
/ 24 марта 2017

В Swift 3.0 вы также можете использовать CGFloat (FLT_MAX), особенно если вы хотите использовать его в других случаях, таких как zIndex, где CGFloat.greatestFiniteMagnitude будет вне диапазона.

...