2012-06-19 3 views
27

Я хочу убедиться, что CGSize меньше или равен другим CGSize. например:Как сравнить две переменные CGSize?

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

Как бы это сравнить?

+6

Это зависит от того, как вы определяете «меньше». Поскольку у вас есть два измерения, они оба должны быть меньше? Или просто высота? Только ширина? Или, возможно, область определенного прямоугольника? – lnafziger

+0

меньше по меньшей мере 1 размер меньше, а второе измерение не больше (может быть равным). –

+0

Итак, общая площадь не имеет значения? Если у вас есть одна коробка размером 100x100, а другая - 101x25, то по вашему определению она больше? – lnafziger

ответ

18

Определить, подходит ли firstSize в secondSize без вращения:

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

На самом деле, это будет правда, если они имеют одинаковый размер. Он хочет «меньше» по крайней мере в одном измерении. – lnafziger

+1

@Inafziger: «меньше * или равно *» –

+0

@KevinBallard прочитал свой первый комментарий: «хотя бы одно измерение меньше ....» – lnafziger

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

Для проверки равенства можно использовать, 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 
} 
+9

Dvir Levy ищет «меньше или равно», как описано в вопросе. В случае, если 'CGSizeEqualToSize()' возвращает false, мы все еще не знаем, больше или меньше. – Anne

4

Следующая функция определяет, является ли прямоугольник 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) 
    ); 
} 

Вместо того, чтобы писать полную логику себя трудно читать условные операторы, вы можете использовать встроенные, встроенные вспомогательные функции, чьи имена носят описательный.

Хотя я еще не проводил исследования, этот метод, вероятно, медленнее в исполнении, чем принятый ответ, поскольку он включает в себя преобразование двух CGSizes в две структуры CGRects C. Хотя у этого есть преимущество, чтобы быстрее понять читателя.

0

Довольно прямое удлинение для Swift 4.0 на CGSize. Как указано в 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 
Смежные вопросы