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 上的主要内容,如果未能解决你的问题,请参考以下文章
获取嵌套在 UIScrollView 中的 UIImageView 中两个 CGPoints 之间的距离
在 CoreData 数据库中存储包含 CGPoints 的数组(Swift)