【问题标题】: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 参考.

标签: objective-c ios foundation core-foundation cgfloat


【解决方案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 将超出范围。

            【讨论】:

              猜你喜欢
              • 2016-10-16
              • 2018-10-29
              • 1970-01-01
              • 2018-08-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多