2012-06-19 14 views
27

Desidero assicurarmi che lo CGSize sia minore o uguale a un altro CGSize. Mi piace:Come confrontare due variabili CGSize?

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

Come confrontare questo?

+6

Dipende da come si definisce "più piccolo". Dal momento che hai due dimensioni, entrambe devono essere più piccole? O solo l'altezza? Solo la larghezza? O forse l'area del rettangolo definito? – lnafziger

+0

minore è almeno 1 dimensione è minore mentre la seconda dimensione non è più grande (potrebbe essere uguale). –

+0

Ok, quindi l'area totale non ha importanza? Se hai una scatola che è 100x100 e un'altra che è 101x25, quindi secondo la tua definizione, è più grande? – lnafziger

risposta

18

Determinare se firstSize si inserisce in secondSize senza ruotare:

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

In realtà, questo sarà vero se hanno le stesse dimensioni. Vuole "più piccolo" in almeno una dimensione. – lnafziger

+1

@Inafziger: "minore * o uguale a *" –

+0

@KevinBallard ha letto il suo primo commento: "almeno una dimensione è più piccola ...." – lnafziger

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

Per verificare la presenza di uguaglianza è possibile utilizzare, CGSizeEqualToSize funzione 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 Prelievo in cerca di "minore o uguale a" come descritto nella domanda. Nel caso in cui 'CGSizeEqualToSize()' restituisca false, non sappiamo ancora se è più grande o più piccolo. – Anne

4

la seguente funzione determina se il rettangolo del CGSize nel primo parametro si inserisce interamente all'interno o l'estensione del rettangolo del CGSize nel secondo parametro.

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

Invece di scrivere la logica piena te stesso con difficili da leggere istruzioni condizionali, è possibile utilizzare il built-in, funzioni inline di supporto i cui nomi sono descrittivi.

Mentre non ho effettuato la ricerca, questo metodo è probabilmente più lento in esecuzione rispetto alla risposta accettata poiché implica la conversione di due CGSize in due strutture CGRects C. Sebbene abbia il vantaggio di essere più veloce da comprendere dal lettore.

0

Un'estensione piuttosto diretta per Swift 4.0 su CGSize. Come afferma OP, questo presuppone che si tratti di dimensioni e non di aree.

import UIKit 

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

Si può quindi verificare con i seguenti valori:

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