web-dev-qa-db-ja.com

最大CGFloat値の定数はありますか?

任意の長さの任意のテキストのテキストの高さを計算するためにCGSizeを作成する必要があります。 UIKitにはこのNiceメソッド-sizeWithFont:constrainedToSize:があり、テキストの幅は高さではなく幅のみに制限されています。

このために、高さの可能な最大のCGFloatを設定する必要があります。

「CGFloatMax」のような定数はありますか?

51
Proud Member

CGGeometry 定義:

#define CGFLOAT_MAX FLT_MAX
42

Swift 2を使用している場合、以下を使用する必要があります。

CGFloat.max

Swift 3を使用している場合、以下を使用する必要があります。

CGFloat.greatestFiniteMagnitude

ご了承ください CGFloat.maxは、Swift 3が出たときに削除されました。これは documentation に反映されています。

170
GBF_Gabriel
13
Josh Caswell

CGFloatは単なるfloatなので、FLT_MAXから<float.h>を安全に使用できます。

編集:他の人が指摘しているように、CGFLOAT_MAXはすでに定義されているようですので、32ビットプラットフォームでも同じですが、FLT_MAXではなく一貫性のために使用する必要があります。

5
Paul R

私はSwiftバージョンの最小 CGFloat値を探していて、もしあなたがここに着いた;)そして、ここに答えがあります:

CGFloat.leastNormalMagnitude
3
AamirR
CGSize size = CGSizeMake(CGFLOAT_MIN, CGFLOAT_MAX);

幅= 0.0000000000000000000000000000000000000000000117549435、高さ= 3.40282347E + 38

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であると想定されていますが、double値(つまりCGFLOAT_MAX)が割り当てられるとオーバーフローするfloatのように見えます。 this Apple documentation page はNSLogで%fを使用するとdoubleが出力されることを示しています。これが間違っている場合は誰かが修正してください。

言うまでもなく、FLT_MAXがあなたのケースで機能する場合、特にdoubleまたはCGFloatではなくfloat引数を受け入れるライブラリに依存している場合は特に、CGFLOAT_MAXの代わりに今のところそれを使い続けることができます。

1
Leo Thiessen

In Swift 3.0、また、CGFloat.greatestFiniteMagnitudeが範囲外になるzIndexのような他のケースで使用したい場合は、CGFloat(FLT_MAX)を使用することもできます。

0
Anson Yao