【问题标题】:How to compare two CGSize variables?如何比较两个 CGSize 变量?
【发布时间】:2012-06-19 19:01:16
【问题描述】:

我想确保CGSize 小于或等于另一个CGSize。喜欢:

CGSize firstSize = CGSizeMake(1.0,1.0);
CGSize secondSize = CGSizeMake(5.0,3.0);
if(firstSize <= secondSize){
    Do Stuff . . .
}

我将如何比较这个?

【问题讨论】:

  • 这取决于你如何定义“更小”。既然你有两个维度,它们都必须更小吗?还是只是身高?只是宽度?或者也许是定义的矩形的面积?
  • smaller 至少 1 个维度较小,而第 2 个维度不较大(可以相等)。
  • 好的,所以总面积无关紧要?如果你有一个 100x100 的盒子和另一个 101x25 的盒子,那么根据你的定义,它更大?
  • 大概 Dvir 想知道一种尺寸所描述的区域是否可以适合另一种尺寸所描述的区域。
  • 最后一个问题,轮换呢?例如,如果框 1 是 100x25 而框 2 是 24x99 会怎样?更小还是更大?

标签: objective-c cocoa-touch core-graphics


【解决方案1】:

您可以使用 CGSizeEqualToSize 函数来检查相等性,Apple

CGSize firstSize = CGSizeMake(1.0,1.0);
CGSize secondSize = CGSizeMake(5.0,3.0);

if(CGSizeEqualToSize(firstSize, secondSize)) {
    //they are equal
}else{
    //they aren't equal
}

【讨论】:

  • Dvir Levy 正在寻找问题中描述的“小于或等于”。如果CGSizeEqualToSize()返回false,我们仍然不知道它是更大还是更小。
【解决方案2】:

确定firstSize 是否适合secondSize 而不旋转:

if(firstSize.width <= secondSize.width && firstSize.height <= secondSize.height)

【讨论】:

  • 实际上,如果它们的大小相同,这将是正确的。他希望至少在一个维度上“更小”。
  • @Inafziger: "小于或等于"
  • 在这种情况下,以下应该可以工作:if((firstSize.width &lt;= secondSize.width &amp;&amp; firstSize.height &lt; secondSize.height) || firstSize.width &lt; secondSize.width &amp;&amp; firstSize.height &lt;= secondSize.height)。无论如何,使用 .width.height 属性应该可以解决问题。
  • “至少一维更小……”是我对“更小”的定义。这应该工作谢谢。我只是觉得可可对此有更优雅的东西。
【解决方案3】:

以下函数确定第一个参数中 CGSize 的矩形是否完全适合第二个参数中 CGSize 的矩形范围内或范围内。

- (BOOL)size:(CGSize)smallerSize isSmallerThanOrEqualToSize:(CGSize)largerSize {

    return CGRectContainsRect(
        CGRectMake(0.0f, 0.0f, largerSize.width, largerSize.height),
        CGRectMake(0.0f, 0.0f, smallerSize.width, smallerSize.height)
    );
}

您可以使用名称具有描述性的内置内联帮助函数,而不是用难以阅读的条件语句自己编写完整的逻辑。

虽然我还没有进行研究,但此方法的执行速度可能比公认的答案要慢,因为它涉及将两个 CGSize 转换为两个 CGRects C 结构。虽然它确实具有读者更快理解的优点。

【讨论】:

    【解决方案4】:

    这是使用运算符重载的好例子。

    按面积比较(即一个CGSize 的大小比另一个大):

    func <=(left: CGSize, right: CGSize) -> Bool {
        return (left.width * left.height) <= (right.width * right.height)
    }
    

    或者,按尺寸进行比较(即一个 CGSize 是否适合另一个):

    func <=(left: CGSize, right: CGSize) -> Bool {
        return (left.width <= right.width) && (left.height <= right.height)
    }
    

    显然,您不能在项目中全局包含这两个版本,因此为了安全起见,您可能需要考虑将函数 private 设置为当前文件。

    【讨论】:

      【解决方案5】:
      if(firstSize.width <= secondSize.width && firstSize.height <= secondSize.height &&
          firstSize.width*firstSize.height < secondSize.width*secondSize.height)
      

      【讨论】:

        【解决方案6】:

        Swift 4.0CGSize 上的一个非常简单的扩展。 正如 OP 所说,这假设您关心的是尺寸而不是面积。

        import UIKit
        
        extension CGSize {
            func isGreaterOrEqual(to size: CGSize) -> Bool {
                return width >= size.width &&
                    height >= size.height
            }
        }
        

        然后您可以使用以下值对其进行测试:

        let size = CGSize(width: 100, height: 100)
        let smaller = CGSize(width: 80, height: 80)
        let bigger = CGSize(width: 120, height: 120)
        
        let small = size.isGreaterOrEqual(to: smaller) // true
        let big = size.isGreaterOrEqual(to: bigger) // false
        let same = size.isGreaterOrEqual(to: size) // true
        

        【讨论】:

          【解决方案7】:

          灵感来自Jonathan's 答案。它应该更安全,因为有时值可以像这样667.0000000000001

          extension CGSize {
              static func <= (left: CGSize, right: CGSize) -> Bool {
                  let delta = 0.001
                  return (left.width - right.width) < delta && (left.height - right.height) < delta
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-01-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多