Я работаю над проектом, который включает в себя несколько более сложную динамическую компоновку элементов интерфейса, чем я привык. Я всегда чувствую себя глупо, когда пишу сложный код, который проверяет, близок ли тот-то к такому-то-то-то-то-то-другому уровню, и в этом случае он перемещается на x% в каком-то направлении и т. Д. Это просто не так, как программирование. Программирование должно быть как можно более декларативным!
Именно потому, что то, что я собираюсь сделать, довольно просто, я подумал, что это хорошая возможность попробовать что-то новое, и я подумал об использовании NSPredicate
в качестве простых ограничений. решатель . До сих пор я использовал NSPredicate
только для очень простых задач, но я знаю, что он способен на гораздо большее.
Есть ли какие-нибудь идеи, опыт, примеры, предупреждения, идеи, которые могут быть полезны здесь?
Я приведу очень простой пример, чтобы было что-то конкретное, чтобы ответить. Как я могу использовать NSPredicate
для решения следующих ограничений:
viewB.xmid = (viewB.leftEdge + viewB.width) / 2
viewB.xmid = max(300, viewA.rightEdge + 20 + viewB.width/2)
("viewB должен быть горизонтально центрирован по координате 300, если только его левый край не попадает в пределах 20 пикселей от правого края viewB, и в этом случае левый край viewA должен оставаться фиксированным на уровне 20 пикселей справа от правого края viewB и горизонтального центра viewA толкаться вправо. ")
viewA.rightEdge
и viewB.width
могут различаться, и это «входные переменные».
РЕДАКТИРОВАТЬ: Любое решение, вероятно, придется использовать NSExpression
метод -(id)expressionValueWithObject:(id)object context:(NSMutableDictionary *)context
.
Этот ответ актуален.