最大的CGFloat值有一个常数吗?

66

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

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

是否有像"CGFloatMax"这样的常量?


@回答:我给每个人点了赞...因为他们的回复间隔不到4秒哈哈。 - Jesse Naugher
查看文档可能比在这里发帖询问问题更省时间。 - jscs
1
@Josh Caswell:我认为很多人不知道(至少是部分)文档的存在。在这种情况下,UIKit 在各个地方都使用 CGFloat,所以提问者可能只查看了 UIKit 文档。@Mikhalo Ivanokov,你需要的是 Core Graphics (CG) 文档:http://developer.apple.com/library/ios/documentation/CoreGraphics/Reference/CoreGraphics_Framework/ 另外有用的是苹果的在线文档搜索(我发现比 Xcode 或者 Google 更好用):http://developer.apple.com/library/ios/search/?q=CGFloat+max - Peter Hosey
1
@Peter:我知道文档可能难以导航,我也理解这是需要学习的技能,但在Xcode的搜索框中输入“CGFloat”会直接跳转到CGGeometry参考。 - jscs
8个回答

191

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

CGFloat.max

对于使用 Swift 3 的用户,你应该使用:

CGFloat.greatestFiniteMagnitude

请注意,当Swift 3发布时,CGFloat.max已被移除,这在文档中有所体现。


7
从Swift 3开始,这个值现在是CGFloat.greatestFiniteMagnitude:"对应于C语言中的宏FLT_MAX、DBL_MAX等。这些宏的命名可能有些误导,因为无穷大是大于此值的。" - jemmons

48

CGGeometry 定义了:

#define CGFLOAT_MAX FLT_MAX

15

12

我正在寻找一个Swift版本的最小CGFloat值,然后就来到了这里。如果你也是这样的话,那么这里就有答案:

CGFloat.leastNormalMagnitude

6

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

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


3
类型会根据系统而变化。尽管目前iOS都是32位的,但我们不应该假设typedef的底层类型。 - jscs
@Josh:确实 - 谢谢 - 我现在已经在后续编辑中注明了这一点。 - Paul R
CGFloat并不总是float类型- 当在OS X上为64位编译应用程序时,CGFloat被定义为double类型。请参见CGBase.h文件,大约在第100行左右。 - leecbaker
@leecbaker:这是一个iOS特定的问题,所以现在一切都是32位的。但是没错,如果我们将讨论扩展到OS X,那么我们必须允许64位构建,其中CGFloat是double类型。 - Paul R
@PaulR 抱歉,我在扫描问题时错过了 iOS 标签 / UIKit 提及。 - leecbaker
9
嘿,我刚从未来回来,他们那里已经有了64位的iOS设备! ;) - macbirdie

1
CGSize size = CGSizeMake(CGFLOAT_MIN, CGFLOAT_MAX);

宽度为0.0000000000000000000000000000000000000117549435,高度为3.40282347E+38。


1
这更像是一条评论而不是答案,但我没有足够的声望来评论。我刚刚发现在iPhone 5S(64位)设备上使用iOS 7.1.2和Xcode 5.1.1时,使用CGFLOAT_MAX会出现意外行为,以下是代码:
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

我按下command+点击CGFLOAT_MAX,Xcode将我带到了CoreGraphics框架的CGBase.h文件,并显示以下宏定义:

# define CGFLOAT_MAX DBL_MAX

我按下 command+ 点击 CGFloat,Xcode 就会带我到同一文件的另一行:
typedef CGFLOAT_TYPE CGFloat;

然后我按住command键点击CGFLOAT_TYPE,它就会跳转到这里的#define行:

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

所以,由于某种原因,我的CGFloat变量应该是一个double,但是当它被赋予一个double值(即CGFLOAT_MAX)时,它似乎是一个会溢出的float。据我所知这个苹果文档页面表明使用%f与NSLog应该打印double - 如果我错了,请有人纠正我。

总之,如果FLT_MAX适用于您的情况,您可能希望暂时坚持使用它,而不是CGFLOAT_MAX,特别是如果您依赖于一个专门接受浮点参数而不是double或CGFloat的库。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接