最大 CGFloat 值是不是有常数?

Posted

技术标签:

【中文标题】最大 CGFloat 值是不是有常数?【英文标题】:Is there a constant for the maximum CGFloat value?最大 CGFloat 值是否有常数? 【发布时间】:2011-09-11 05:27:47 【问题描述】:

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

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

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

【问题讨论】:

@answers:每个人都投了赞成票。考虑到他们之间的差距在 4 秒之内,哈哈。 查看此类问题的文档可能比在此处发帖花费的时间更少。 @Josh Caswell:我认为很多人不知道(至少部分)文档存在。在这种情况下,UIKit 全部使用 CGFloat,所以提问者可能只查看了 UIKit 文档。 @Mikhalo Ivanokov,您需要的是 Core Graphics (CG) 文档:developer.apple.com/library/ios/documentation/CoreGraphics/… Apple 的在线文档搜索也很有用(我发现它比 Xcode 或为此目的的 Google 更好):developer.apple.com/library/ios/search/?q=CGFloat+max @Peter:我知道文档很难导航,而且我知道这是一项必须学习的技能,但是在 Xcode 的搜索框中输入“CGFloat”会直接进入 CGGeometry 参考. 【参考方案1】:

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

CGFloat.max

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

CGFloat.greatestFiniteMagnitude

请注意,CGFloat.max 在 Swift 3 推出时已被删除,如 documentation 所示。

【讨论】:

请注意,从 Swift 3 开始,它现在是 CGFloat.greatestFiniteMagnitude:“对应于 C 宏 FLT_MAX、DBL_MAX 等。这些宏的命名有点误导,因为无穷大大于这个值。” 【参考方案2】:

CGGeometry 定义:

#define CGFLOAT_MAX FLT_MAX

【讨论】:

【参考方案3】:

CGFLOAT_MAX怎么样?

【讨论】:

【参考方案4】:

我一直在寻找 minimum CGFloat 值的 Swift 版本,如果你也是,我在这里找到了 ;) 那么这就是答案:

CGFloat.leastNormalMagnitude

【讨论】:

【参考方案5】:

CGFloat 只是一个float,因此您可以安全地使用来自<float.h>FLT_MAX

编辑:正如其他人现在指出的那样,CGFLOAT_MAX 似乎已经为您定义了,因此您应该使用它来保持一致性而不是 FLT_MAX,即使它们在 32 位平台上是相同的。

【讨论】:

类型会因系统而异。诚然 iOS 现在都是 32 位的,但不应假定 typedef 的底层类型。 @Josh:确实 - 谢谢 - 我现在在随后的编辑中注意到了这一点 CGFloat 并不总是浮点数——在 OS X 上为 64 位编译应用程序时,CGFloat 被定义为双精度浮点数。参见 CGBase.h,大约第 100 行。 @leecbaker:这是一个 iOS 特有的问题,所以至少现在一切都是 32 位的。但是,是的,你是对的,如果我们将讨论扩展到 OS X,那么我们必须允许 CGFloat 是双精度的 64 位构建。 嘿,我刚从未来回来,他们实际上已经有了 64 位 iOS 设备! ;)【参考方案6】:

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

我刚刚遇到了使用 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)时会溢出。据我所知,this Apple documentation page 表示使用 %f 和 NSLog 应该打印双精度 - 如果这是错误的,请有人纠正我。

总而言之,如果 FLT_MAX 适用于您的情况,您现在可能希望坚持使用它而不是 CGFLOAT_MAX,尤其是当您依赖专门接受浮点参数而不是双精度或 CGFloat 的库时。

【讨论】:

【参考方案7】:
CGSize size = CGSizeMake(CGFLOAT_MIN, CGFLOAT_MAX);

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

【讨论】:

【参考方案8】:

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

【讨论】:

以上是关于最大 CGFloat 值是不是有常数?的主要内容,如果未能解决你的问题,请参考以下文章

获取最接近的 CGFloat 值

是否有一个常数来定义 long 或 integer 的最大值?

sql中常数数学函数

关于在 Swift 4 中返回 CGFloat 值

根据随机 CGFloat 值重新绘制 UIBezierPath

无法将'CGFloat'类型的值转换为闭包结果类型'CGPoint'