2012-06-19 14 views
27

Chcę się upewnić, że CGSize jest mniejszy lub równy CGSize. na przykład:Jak porównać dwie zmienne CGSize?

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

Jak mogę to porównać?

+6

To zależy od tego, jak zdefiniujemy „mniejszy”. Skoro masz dwa wymiary, czy oba muszą być mniejsze? A może po prostu wysokość? Tylko szerokość? A może obszar zdefiniowanego prostokąta? – lnafziger

+0

mniejszy to co najmniej 1 wymiar jest mniejszy, natomiast drugi wymiar nie jest większy (może być równy). –

+0

OK, więc całkowita powierzchnia nie ma znaczenia? Jeśli masz jedno pudełko o wymiarach 100 x 100 i inne o rozmiarze 101x25, to według twojej definicji jest ono większe? – lnafziger

Odpowiedz

18

Określić czy firstSize pasuje do secondSize bez obracania:

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

W rzeczywistości będzie to prawdą, jeśli mają ten sam rozmiar. On chce "mniejszy" w co najmniej jednym wymiarze. – lnafziger

+1

@Inafziger: "mniejszy * lub równy *" –

+0

@KevinBallard przeczytał swój pierwszy komentarz: "przynajmniej jeden wymiar jest mniejszy ..." – lnafziger

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

Aby sprawdzić równość można wykorzystać, CGSizeEqualToSize funkcji przez 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 szukający "mniejszego lub równego" jak opisano w pytaniu. W przypadku, gdy 'CGSizeEqualToSize()' zwraca fałsz, wciąż nie wiemy, czy jest większy czy mniejszy. – Anne

4

następujących funkcji określa czy prostokąta CGSize pierwszym parametrem mieści się całkowicie wewnątrz lub w zakresie prostokąta CGSize drugi parametr.

- (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) 
    ); 
} 

Zamiast pisać pełnej Logic się z trudnym do odczytania instrukcje warunkowe, można użyć wbudowanej, funkcje inline pomocnicze, których nazwy są opisowe.

Chociaż nie przeprowadziłem badań, ta metoda jest prawdopodobnie wolniejsza w wykonaniu niż akceptowana odpowiedź, ponieważ wymaga przekonwertowania dwóch CGSizes na dwa CGRects C struct. Chociaż ma tę zaletę, że czyta go szybciej.

0

Dość proste przedłużenie dla Swift 4.0 na CGSize. Zgodnie z PO, zakłada to, że dotyczy to wymiarów, a nie obszaru.

import UIKit 

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

można następnie przetestować go z następującymi wartościami:

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 
Powiązane problemy