2012-12-19 3 views
0

CGPoints의 NSArray가 있습니다.CGPoints의 NSArray에 NSPredicate

실제로 배열의 모든 CGPoint를 포함하는 최소 CGRect를 얻고 싶습니다. 이 작업을 수행하는 데 이미 iOS 기능이 있습니까?

그렇지 않으면 내가 수동으로 minX, maxX, minY, maxY를 가져가, 내 CGRect 이런 식으로 구성됩니다 : 내가 자 NSPredicate로있는 NSArray를 필터링하기 위해 필요한이 들어

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

합니다.

(내가 알고 내가 수동으로 배열을 필터 만에 올 수! ...)

답변

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

그것이 맞습니다. (사실, CGPoint의 NSArray에서 최대, 최소값을 얻기 위해 NSPredicate를 사용할 수 없다는 것입니다). –

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