62

我需要创建一个 CGSize 来计算任意长度的任意文本的文本高度。UIKit 有这个很好的方法 -sizeWithFont:constrainedToSize: 我的文本只在宽度上受到限制,但在高度上没有。

为此,我需要为高度设置最大可能的 CGFloat。

有没有像“CGFloatMax”这样的常数?

4

8 回答 8

188

对于那些使用 Swift 2 的人,你应该使用:

CGFloat.max

对于那些使用 Swift 3 的人,你应该使用:

CGFloat.greatestFiniteMagnitude

请注意,CGFloat.max在 Swift 3 发布时已将其删除,如文档中所反映的那样。

于 2014-10-03T23:18:06.097 回答
46

CGGeometry defines:

#define CGFLOAT_MAX FLT_MAX
于 2011-06-08T21:02:22.227 回答
15

How about CGFLOAT_MAX?

于 2011-06-08T21:02:25.027 回答
10

I was looking for a Swift version of minimum CGFloat value and landed here, if you too ;) then here is the answer:

CGFloat.leastNormalMagnitude
于 2017-08-08T12:49:40.170 回答
5

A CGFloat is just a float so you can safely use FLT_MAX from <float.h>.

EDIT: As others have now pointed out it looks like CGFLOAT_MAX is already defined for you so you should use that for consistency rather than FLT_MAX, even though they are the same thing on 32 bit platforms.

于 2011-06-08T21:02:21.193 回答
1

这更像是评论而不是答案,但是我目前没有足够的声誉发表评论。

我刚刚遇到了使用 CGFLOAT_MAX 的意外行为:在运行 iOS 7.1.2 并使用 Xcode 5.1.1 的 iPhone 5S(64 位)设备上,以下代码:

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 将我带到 CoreGraphics 框架 CGBase.h 文件,其中包含以下宏定义:

# define CGFLOAT_MAX DBL_MAX

我命令+单击 CGFloat,Xcode 将我带到同一文件中的另一行:

typedef CGFLOAT_TYPE CGFloat;

然后我命令+单击 CGFLOAT_TYPE 并跳转到 #define 行:

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

因此,出于某种原因,我的 CGFloat 变量应该是一个双精度变量,但是它似乎是一个浮点数,当它被分配一个双精度值(即 CGFLOAT_MAX)时会溢出。据我所知,这个 Apple 文档页面表明使用 %f 和 NSLog 应该打印双精度 - 如果这是错误的,请有人纠正我。

综上所述,如果 FLT_MAX 适用于您的情况,您现在可能要坚持使用它而不是 CGFLOAT_MAX,特别是如果您依赖一个专门接受浮点参数而不是双精度或 CGFloat 的库。

于 2014-07-09T16:12:09.523 回答
1
CGSize size = CGSizeMake(CGFLOAT_MIN, CGFLOAT_MAX);

宽度 = 0.0000000000000000000000000000000000000117549435,高度 = 3.40282347E+38

于 2015-11-04T05:41:55.553 回答
0

在 Swift 3.0 中,您还可以使用 CGFloat(FLT_MAX),特别是如果您想在 zIndex 等其他情况下使用它,其中 CGFloat.greatestFiniteMagnitude 将超出范围。

于 2017-03-24T00:15:01.363 回答