如何按CGRect筛选NSArray中的CGPoints

4

我有一个包含 CGPointsNSArray。我想通过筛选来仅包括在矩形内的点。

如何制定一个 NSPredicate,使得每个点都满足以下条件:

CGRectContainsPoint(windowRect, point);

目前的代码如下:

NSArray *points = [NSArray arrayWithObjects: [NSValue valueWithCGPoint:pointAtYZero] ,
                                             [NSValue valueWithCGPoint:pointAtYHeight],
                                             [NSValue valueWithCGPoint:pointAtXZero],
                                             [NSValue valueWithCGPoint:pointAtXWidth],
                                             nil];


NSPredicate *inWindowPredicate = [NSPredicate predicateWithFormat:@"CGRectContainsPoint(windowRect, [point CGPointValue])"];
NSArray *filteredPoints = [points filteredArrayUsingPredicate:inWindowPredicate];
1个回答

10

您无法使用谓词格式语法来完成此操作,但是可以使用代码块:

NSArray *points = ...;
CGRect windowRect = ...;    
NSPredicate *inWindowPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
    CGPoint point = [evaluatedObject CGPointValue];
    return CGRectContainsPoint(windowRect, point);
}];
NSArray *filteredPoints = [points filteredArrayUsingPredicate:inWindowPredicate];

请注意,无法使用基于块的谓词(Core Data fetch requests)。


5
您可以跳过谓词(Predicate)直接获得经过块(Block)指定测试的元素:NSArray* filteredPoints = [points objectsAtIndexes:[points indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop){ return CGRectContainsPoint(windowRect, [obj CGPointValue]); }]]; - Ken Thomases
@KenThomases,为什么不把它发布为答案呢? - vikingosegundo
因为omz的回答基本上是正确的,而我的建议只是一个细化。OP确实问了“我该如何制定一个NSPredicate……”。 :) - Ken Thomases
如何通过CGRect过滤NSArray中的CGPoints - vikingosegundo
@omz,我确实这样做了,但我的程序崩溃了。我自然而然地认为谓词是罪魁祸首。我猜这个错误出现在其他地方。 - TheOne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接