2012-12-19 50 views
0

我有一个CGArray的NSArray。对CGPoints NSArray的NSPredicate

我实际上想要获取包含该数组中所有CGPoint的最小CGRect。 有没有iOS功能可以做到这一点?

否则我将不得不手动获取minX, maxX, minY, maxY,构建我的CGRect这样:

CGrectMake(minX, minY, maxX-minX, maxY-minY); 

为此,我需要用NSPredicate来筛选的NSArray。

(我知道,我可以在阵列手动过滤,不过来了!...)

回答

2

没有公开的API可以完成您要求的功能。你必须自己写。

无论如何这不适合NSPredicate。谓词是用于过滤值,而不是用于构建新值。

CGRect boundsOfPointArray(NSArray *array) { 
    CGRect bounds = CGRectNull; 
    for (NSValue *wrapper in array) { 
     CGRect r = (CGRect){ wrapper.CGPointValue, CGSizeZero }; 
     bounds = CGRectUnion(bounds, r); 
    } 
} 
+0

就是这样(只要它是真的,您不能使用NSPredicate从CGPoint的NSArray中获取最大值,最小值)。 –

1

这个问题很不清楚。你的意思是你想创建一个包含数组中所有点的最小CGRect?如果是这样,那很简单,只需迭代点数组,以记录minX,maxX,minY和maxY的轨迹。例如

CGFloat minX = CGFLOAT_MAX; 
CGFloat minY = CGFLOAT_MAX; 
CGFloat maxX = -CGFLOAT_MAX; 
CGFloat maxY = -CGFLOAT_MAX; 

for (NSValue *v in pointsArray) { 
    CGPoint p = [v CGPointValue]; 
    minX = fminf(minX, p.x); 
    minY = fminf(minY, p.y); 
    maxX = fmaxf(maxX, p.x); 
    maxY = fmaxf(maxY, p.y); 
} 

CGRect r = CGRectMake(minX, minY, maxX - minX, maxY - minY); 
+0

这正是我的目标,但我想知道是否有更优雅的方法使用NSPredicate。 –

+0

@Tark X和Y可以是负数。您需要将最大值初始化为“-CGFLOAT_MAX”。 –

+0

@robmayoff很对,我还没有意识到CGRectUnion函数,这是一个更简洁的解决方案。 – Tark