web-dev-qa-db-fra.com

Comment comparer deux variables CGSize?

Je veux m'assurer qu'un CGSize est plus petit ou égal à un autre CGSize. comme:

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

Comment pourrais-je comparer cela?

32
Dvir Levy

Déterminez si firstSize s'intègre dans secondSize sans rotation:

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

Pour vérifier l'égalité, vous pouvez utiliser la fonction CGSizeEqualToSize par 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
}
109
iOS-programmer

La fonction suivante détermine si le rectangle de la CGSize dans le premier paramètre correspond entièrement à l'intérieur ou à l'étendue du rectangle de la CGSize dans le deuxième paramètre.

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

Au lieu d'écrire vous-même la logique complète avec des instructions conditionnelles difficiles à lire, vous pouvez utiliser les fonctions d'assistance intégrées intégrées dont les noms sont descriptifs.

Bien que je n'ai pas fait de recherche, cette méthode est probablement plus lente à exécuter que la réponse acceptée car elle implique de convertir les deux CGSizes en deux structures CGRects C. Bien qu'il présente l'avantage d'être plus rapide à comprendre par le lecteur.

5
richardjsimkins
if(firstSize.width <= secondSize.width && firstSize.height <= secondSize.height &&
    firstSize.width*firstSize.height < secondSize.width*secondSize.height)
3
Jim

Une extension assez simple pour Swift 4. sur CGSize. Comme l'indique OP, cela suppose que vous vous souciez des dimensions et non de la surface.

import UIKit

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

Vous pouvez ensuite le tester avec les valeurs suivantes:

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
1
CodeBender

C'est un excellent cas pour utiliser la surcharge de l'opérateur.

Comparez par zone (c'est-à-dire que l'un CGSize est plus grand que l'autre):

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

Ou, comparez par dimensions (c'est-à-dire qu'un CGSize s'insérerait dans un autre):

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

Évidemment, vous ne pouvez pas inclure les deux versions globalement dans votre projet, donc pour être sûr, vous voudrez peut-être envisager de faire la fonction private dans le fichier actuel.

1
Jonathan Ellis