NSPredicate作为约束求解器?

时间:2010-03-02 02:26:48

标签: objective-c cocoa constraints nspredicate linear-programming

我正在开发一个项目,其中包含一些比我习惯的更复杂的界面元素动态布局。我总是觉得愚蠢的编写复杂的代码,检查某某是否接近这样的情况,并在这种情况下将x%向某个方向移动,等等。这不是应该如何编程。编程应该尽可能的声明!

正是因为我要做的事情相当简单,我认为这是一个尝试新事物的好机会,我想用NSPredicate作为简单 { {3}}。到目前为止,我只使用NSPredicate执行非常简单的任务,但我知道它能够做得更多。

是否有任何可能有用的想法,经验,示例,警告和见解?

我将举一个非常简单的例子,以便有一些具体的答案。我如何使用NSPredicate来解决以下约束:

viewB.xmid = (viewB.leftEdge + viewB.width) / 2
viewB.xmid = max(300, viewA.rightEdge + 20 + viewB.width/2)

(“viewB应该在坐标300上水平居中,除非它的左边缘位于viewB右边缘的20个像素内,在这种情况下,viewA的左边缘应保持固定在viewB右边缘右侧20像素和viewA的水平中心被推到右边。“)

viewA.rightEdgeviewB.width可能会有所不同,而且这些是“输入变量”。

编辑:任何解决方案可能都必须使用NSExpression方法-(id)expressionValueWithObject:(id)object context:(NSMutableDictionary *)contextconstraints solver是相关的。

2 个答案:

答案 0 :(得分:1)

Cocoa谓词本质上是Cocoa的一种SQL。他们的大部分力量在于他们能够进行字符串搜索和比较,并且没有关于你正在尝试做什么的额外(有用)设施,这是(据我所知)数字比较。我认为它们也不能用于维护代码。

常规布尔表达式在功能上等同于Cocoa谓词,您可以重新排列并巧妙地将它们分配给一些名称很好的变量。

if (viewAIs20PixelsAway && viewBIs30PixelsAway) {
    [viewA moveToPositionA];
} else ...

(一个非常简单的例子......我可以想出更好的东西。)

另外,你可以把它们塞进一个方法中并像对待NSPredicate一样对它们进行评估。

答案 1 :(得分:0)

使用NSPredicate(和NSExpression)求解简单线性方程式是一件轻而易举的事,但是从那里开始解决任意约束集合(又称线性规划)仍然是一大步。最有希望的方法是做Chris Hanson建议并更新他的BDRuleEngine。有趣的项目,以备不时之需。