Использование дополнительных значений в языке визуального формата Auto Layout - PullRequest
0 голосов
/ 29 апреля 2020

В настоящее время у меня есть представление, ограниченное следующим визуальным форматом:

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 имеет необязательные значения.

1 Ответ

0 голосов
/ 29 апреля 2020

Вы можете упростить это с помощью оператора объединения nil, ??:

let constraints = NSLayoutConstraint.constraints(withVisualFormat: "V:|-(spacing)-[myView]",
                                                 metrics: ["spacing": optionalSpacing ?? 0],
                                                 views: ["myView": myView])

view.addConstraints(constraints)   // or, perhaps better, `NSLayoutConstraint.activate(constraints)`

Это устраняет необходимость в операторе if.


Или, если вы хотите использовать более современный синтаксис привязки:

NSLayoutConstraint.activate([
    myView.topAnchor.constraint(equalTo: view.topAnchor, constant: optionalSpacing ?? 0)
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...