4

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

正是因为我要做的事情相当简单,所以我认为这将是一个尝试新事物的好机会,我想将其NSPredicate用作一个简单的 约束求解器。到目前为止,我只用于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.rightEdge并且viewB.width可以变化,这些是“输入变量”。

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

4

2 回答 2

1

Cocoa 谓词本质上是 Cocoa 的一种 SQL。他们的大部分力量在于他们进行字符串搜索和比较的能力,并且没有额外的(有用的)设施来说明你想要做什么,那就是(据我所知)数字比较。我认为它们也不能提供非常可维护的代码。

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

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

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

另外,您可以将它们隐藏在一个方法中并像使用 NSPredicate 一样评估它们。

于 2010-03-09T19:14:49.137 回答
0

用 NSPredicate(和 NSExpression)求解简单的线性方程是轻而易举的事,但从那里开始求解任意约束集合(又名线性规划)仍然是一大步。最有希望的前进方式是按照Chris Hanson的建议并更新他的BDRuleEngine。下雨天的有趣项目。

于 2010-03-11T19:57:13.750 回答