NSPredicate 在 CGPoints 的 NSArray 上

Posted

技术标签:

【中文标题】NSPredicate 在 CGPoints 的 NSArray 上【英文标题】:NSPredicate on an NSArray of CGPoints 【发布时间】:2012-12-19 16:34:43 【问题描述】:

我有一个 NSArray 的 CGPoints。

我实际上想要获得包含该数组中所有 CGPoints 的最小 CGRect。 是否已经有任何 ios 功能可以做到这一点?

否则我将不得不手动获取minX, maxX, minY, maxY,并以这种方式构造我的 CGRect:

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

为此,我需要使用 NSPredicate 过滤 NSArray。

(我知道,我可以手动过滤数组,但是来吧!...)

【问题讨论】:

【参考方案1】:

没有公共 API 可以满足您的要求。你必须自己写。

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

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

【讨论】:

就是这样(只要它是真的,你不能使用 NSPredicate 从 CGPoints 的 NSArray 中获取最大值、最小值)。【参考方案2】:

这个问题很不清楚。您的意思是要创建一个包含数组中所有点的最小 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);

【讨论】:

这正是我的目标,但我想知道是否有更优雅的方法使用 NSPredicate。 @Tark X 和 Y 可以是负数。您需要将最大值初始化为-CGFLOAT_MAX @robmayoff 非常正确,我也不知道 CGRectUnion 函数,这是一个更简洁的解决方案。 @user1423640 如何使用 NSPredicate 更优雅?

以上是关于NSPredicate 在 CGPoints 的 NSArray 上的主要内容,如果未能解决你的问题,请参考以下文章

如何在iOS中用渐变填充CGPoints定义的形状?

获取嵌套在 UIScrollView 中的 UIImageView 中两个 CGPoints 之间的距离

目标 C:比较 CGPoints

在 CoreData 数据库中存储包含 CGPoints 的数组(Swift)

通过添加两个 CGPoints 的距离来找到 CGPoint

如何通过 Sprite Kit 中的 CGPoints 数组制作动画 - Swift