2011-06-08 29 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 
相關問題