如何比较两个CGSize变量?

时间:2012-06-19 19:01:16

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

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

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

我该如何比较?

6 个答案:

答案 0 :(得分:109)

要检查您可以使用的相等性,Apple CGSizeEqualToSize 功能。

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
}

答案 1 :(得分:18)

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

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

答案 2 :(得分:5)

以下函数确定第一个参数中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结构。虽然它确实具有读者更快理解的优势。

答案 3 :(得分:3)

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

答案 4 :(得分:1)

CGSize Swift 4.0 的直接扩展。 正如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

答案 5 :(得分:1)

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

按面积比较(即,一个比另一个大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设置为当前文件。