比较两个CGSize的最佳信息

时间:2015-12-29 15:31:04

标签: objective-c xcode geometry cgsize

需要你的帮助,我输入了CGSize(例如): 200x300 。与其他CGSize's = [20x20, 100x100, 150x150, 200x100, 200x250, 300x300...]一起使用数组。 请帮我找到阵列中具有最佳比较百分比的最佳项目(例如200x250)......

我尝试用于枚举器,例如:

CGSize inputSize = CGSizeMake(200, 300);
for (int i = 0; i < array.count; i++)
{
    CGSize concurentSize = CGSizeZero;
    switch (i)
    {
     case 0:
     {
         concurentSize.width = 20;
         concurentSize.height = 20;
     }
     and so on...

    float differencePercentWidth = ( concurentSize.width / inputSize.width ) * 100.0;
    float differencePercentHeight = ( concurentSize.height / inputSize.height ) * 100.0;

    if (differencePercentWidth > 90 && differencePercentHeight > 90)
    {
        // FOUND best CGSize... stop
        break.
    }
} 

但是,它不起作用, differencePercentWidth / differencePercentHeight 可以是&gt; 100 =(

我需要一些方法或功能,可以比较2 CGSize的百分比匹配...例如:尺寸200x300是最佳匹配尺寸200x250 ...像:

float matchesInPerсent = CGSizeCompare(firstCGSize, secondCGSize);
//matchesInPerсent = 0.6; // in percents

请帮忙,对不起我的英文,如果您需要更多详情,请告诉我。感谢。

1 个答案:

答案 0 :(得分:1)

尝试类似的逻辑来计算数组中的最大数,但需要少于一个有限值。在这种情况下,计算size.widthsize.height的最大平均百分比,最接近1的百分比是赢家。如果您还需要100%的上限值,则需要插入逻辑以使该值低于100%并在这些值上运行相同的逻辑。

以下代码将为您提供距离数组最接近的百分比大小。

/*

sizes : array of the sizes represented in NSValue format 
size: The size for which you need closest value.

*/
- (CGSize)bestMatch:(NSArray *)sizes withSize:(CGSize)size {
        float bestMatch = 0.0;
        CGSize bestMatchSize = CGSizeZero;
        for (NSValue *value in sizes) {
            float percentage = (value.CGSizeValue.width/size.width + value.CGSizeValue.height/size.height)/2;

            //If you need greater then 100% and closes to the size
            if (percentage > 1.0) {
                percentage = -1*(percentage - 2);
            }

            if (bestMatch < percentage && percentage < 1) {
                bestMatch = percentage;
                bestMatchSize = value.CGSizeValue;
            }
        }
        //If you need best match you can return bestMatch which is closest in percentage

        return bestMatchSize;

 }