В настоящее время у меня есть представление, ограниченное следующим визуальным форматом:
let constraints = NSLayoutConstraint.constraints(withVisualFormat: "V:|[myView]", options: [], views: ["myView": myView]
view.addConstraints(constraints)
Я ввожу необязательное значение, которое, если оно присутствует во время добавления этого ограничения, должно использоваться в качестве интервала в этом визуальный формат. В настоящее время я делаю это так:
let constraints = NSLayoutConstraint.constraints(withVisualFormat: "V:|[myView]", options: [], views: ["myView": myView]
if let constraint = constraints.first, let spacing = optionalSpacing {
constraint.constant = -spacing
}
view.addConstraints(constraints)
, но это выглядит немного не элегантно и убивает главное преимущество визуального формата в том, что вы не можете сразу увидеть, как работает ограничение .
Я также мог бы обновлять строку и метрики визуального формата в зависимости от того, равно ли мое значение нулю при добавлении этого ограничения:
var format: String
var metrics: [String: CGFloat]?
if let spacing = optionalSpacing {
format = "V:|-(spacing)-[myView]"
metrics = ["spacing": spacing]
} else {
format = "V:|[myView]"
}
let constraints = NSLayoutConstraint.constraints(withVisualFormat: "V:|[myView]", options: [], metrics: metrics, views: ["myView": myView]
, но это довольно уродливо.
Мне интересно, сталкивался ли кто-нибудь с подобной проблемой раньше и как они обычно ее решают? Я не вижу много документации онлайн о том, как обрабатывать необязательные значения в строках формата. Я предполагаю, что не могу просто создать строку формата с необязательным значением (а-ля "V:|-(optionalSpacing)-[myView]"
) без предварительной проверки, является ли optionalSpacing
ненулевым, так как словарь metrics
имеет необязательные значения.