4

私は、以前よりも少し複雑なインターフェイス要素の動的レイアウトを含むプロジェクトに取り組んでいます。私はいつも、そのようなものに近いかどうかをチェックし、その場合はそれをある方向にx%移動するなど、複雑なコードを書くのは愚かだと感じます。それはプログラミングのやり方ではありません。プログラミングは可能な限り宣言型でなければなりません!

私がやろうとしていることはかなり単純なので、何か新しいことを試す良い機会になると思い、単純な制約ソルバーNSPredicateとして使用することを考えました。私はこれまで非常に単純なタスクにしか使用していませんが、それがはるかに多くの機能を備えていることを知っています。 NSPredicate

ここで役立つ可能性のあるアイデア、経験、例、警告、洞察はありますか?

非常に簡単な例を挙げますので、具体的な答えがあります。NSPredicate次の制約を解決するにはどうすればよいですか。

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

(「viewBの左端がviewBの右端から20ピクセル以内に収まらない限り、viewBは座標300の水平方向の中心に配置する必要があります。この場合、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 に答える