2012-12-19 48 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