2011-06-08 161 views
40

我需要创建一个CGSize计算任意长度的任意文本的文字高度。 UIKit有这个不错的方法-sizeWithFont:constrainedToSize:我的文本仅限于宽度,但不是高度。CGFloat的最大值是否有一个常量?

对于这一点,我需要设置高度最大可能CGFloat的。

有没有像 “CGFloatMax” 恒定?

+0

@answers:upvoted everyone..considering他们是在4彼此之间的秒。 – 2011-06-08 21:03:39

+0

这可能需要更少的时间来检查此类问题的文档,而不是在此处发布。 – 2011-06-08 21:03:52

+1

@Josh Caswell:我认为很多人不知道(至少部分)文档存在。在这种情况下,UIKit会全面使用CGFloat,因此提问者可能只会查看UIKit文档。 @Mikhalo Ivanokov,你需要的是Core Graphics(CG)文档:http://developer.apple.com/library/ios/documentation/CoreGraphics/Reference/CoreGraphics_Framework/也有用的是苹果的在线文档搜索(我已经发现比Xcode更好,或者为此目的,谷歌):http://developer.apple.com/library/ios/search/?q=CGFloat+max – 2011-06-08 22:08:28

回答

5

A CGFloat只是一个float所以你可以安全地使用FLT_MAX<float.h>

编辑:正如其他人现在指出,它看起来像CGFLOAT_MAX已经为您定义,所以你应该使用它的一致性,而不是FLT_MAX,即使它们是在32位平台上的相同的东西。

+3

虽然类型会根据系统而变化。当然,iOS现在都是32位的,但不应该假设typedef的基础类型。 – 2011-06-08 21:04:44

+0

@Josh:确实 - 谢谢 - 我已经在后续编辑中注意到了这一点 – 2011-06-08 21:06:15

+0

CGFloat并不总是一个浮点型 - 当在OS X上编译64位应用程序时,CGFloat被定义为double。请参阅CGBase.h,关于第100行。 – leecbaker 2011-11-21 22:32:26

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的变量应该是双,但它似乎是当它被分配的double值溢出的浮动(即CGFLOAT_MAX)。据我可以告诉this Apple documentation page表示使用%F与NSLog应打印双人 - 请纠正我,如果这是错误的。

这就是说,如果FLT_MAX适用于您的情况,那么现在您可能希望坚持使用它,而不是CGFLOAT_MAX,尤其是如果您依赖的是专门接受float参数而不是double或CGFloat的库。

143

对于使用斯威夫特2这些,你应该使用:

CGFloat.max 

对于使用斯威夫特3的,你应该使用:

CGFloat.greatestFiniteMagnitude 

注意CGFloat.max被去除时,斯威夫特3出来,如体现在documentation

+0

Simple,clean and cool) – 2016-06-07 10:54:59

+4

注意从Swift 3开始,现在是'CGFloat.greatestFiniteMagnitude':“对应于C宏FLT_MAX,DBL_MAX等。这些宏的命名有些误导,因为无穷大大于此值值。” – jemmons 2016-07-10 14:41:07

+0

很好,很清楚! – 2017-01-25 10:26:57

1
CGSize size = CGSizeMake(CGFLOAT_MIN, CGFLOAT_MAX); 

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

0

在雨燕3.0,您还可以使用CGFloat的(FLT_MAX),特别是如果你想在其他情况下,像用zIndex,其中CGFloat的使用它。 “最大有限度”将超出范围。

3

我一直在寻找最低 CGFloat的值的​​斯威夫特版本,并降落在这里,如果你太;),那么这里就是答案:

CGFloat.leastNormalMagnitude 
相关问题