Я не знаю, как поставить .isActive часть.
Каждая из цитируемых вами строк делает несколько вещей. Например:
buttonBar.topAnchor.constraint(equalTo: segmentedControl.bottomAnchor).isActive = true
Вы должны понимать, что здесь происходит, чтобы иметь возможность преобразовать его в другой язык. Давайте разберем его слева направо:
buttonBar
Это переменная, которая указывает на какое-то представление, предположительно UIToolbar
, но на самом деле это не имеет значения, если это представление.
.topAnchor
Вы вызываете метод доступа topAnchor
, который возвращает объект NSLayoutAnchor
(фактически объект NSLayoutYAxisAnchor
). Objective-C имеет схожий точечный синтаксис для аксессоров, поэтому вы также можете сказать buttonBar.topAnchor
там, но вы также можете написать его как [buttonBar topAnchor]
, что может помочь вам увидеть, что происходит.
.constraint(equalTo: ________)
Этоэто вызов метода constraint(equalTo:)
. Точечный синтаксис Objective-C не работает, когда задействованы параметры, поэтому вам нужен синтаксис сообщений. Если вы не уверены, как перевести имя, просто найдите имя Swift и затем измените документы, чтобы показать Objective-C: constraintEqualToAnchor:
. Таким образом, эта часть переводится как [_____ constraintEqualToAnchor:_____]
.
segmentedControl.bottomAnchor
Это то же самое, что и выше: вы просто получаете bottomAnchor
свойство segmentedControl
. Результат используется в качестве параметра для метода constraintEqualToAnchor:
. Давайте сложим вместе то, что у нас получилось:
[[buttonBar topAnchor] constraintEqualTo:[segmentedControl bottomAnchor]]
Другими словами, вы говорите верхнему якору панели кнопок, чтобы создать ограничение, которое сделает его равным нижнему якору элемента управления сегментом. Это ограничение возвращается методом constraintEqualTo:
, который подводит нас к последней части:
.isActive = true
Здесь вы устанавливаете свойство isActive
ограничения, возвращаемого constraintEqualTo:
. Итак, в Objective-C вы получаете:
[[[buttonBar topAnchor] constraintEqualTo:[segmentedControl bottomAnchor]] setActive:YES];
Или, используя точечный синтаксис Obj-C:
[buttonBar.topAnchor constraintEqualTo:segmentedControl.bottomAnchor].active = YES;
Да, но, например, как я могу умножитьв последней строке?
Эта последняя строка:
buttonBar.widthAnchor.constraint(equalTo: segmentedControl.widthAnchor, multiplier: 1 / CGFloat(segmentedControl.numberOfSegments)).isActive = true
Если вы выполнили все вышеперечисленное, то вы, вероятно, можете видеть, что вы действительно делаете то же самое, просто вызывая другой метод, чтобы получить ограничение. Этот метод constraint(equalTo:multiplier:)
в Swift или constraintEqualToAnchor:multiplier:
в Objective-C. Так что сделайте то же самое ...
[_____ constraintEqualToAnchor:_____ multiplier:_____].active = YES;
Теперь просто заполните пробелы:
[buttonBar.widthAnchor constraintEqualToAnchor:segmentedControl.widthAnchor
multiplier:1/CGFloat(segmentedControl.numberOfSegments)].active = YES;