Как я могу превратить это из быстрой в цель-с? - PullRequest
0 голосов
/ 01 октября 2019

Я следую учебному пособию, но оно быстро, и проект, над которым я работаю, частично написан на Objective-C. Я уже «перевел» половину кода, но пока не могу изменить эту часть.

// Constrain the top of the button bar to the bottom of the segmented control
buttonBar.topAnchor.constraint(equalTo: segmentedControl.bottomAnchor).isActive = true
buttonBar.heightAnchor.constraint(equalToConstant: 5).isActive = true
// Constrain the button bar to the left side of the segmented control
buttonBar.leftAnchor.constraint(equalTo: segmentedControl.leftAnchor).isActive = true
// Constrain the button bar to the width of the segmented control divided by the number of segments
buttonBar.widthAnchor.constraint(equalTo: segmentedControl.widthAnchor, multiplier: 1 / CGFloat(segmentedControl.numberOfSegments)).isActive = true

У меня уже есть это, но я не знаю, как поставить .isActive часть.

[buttonBar.topAnchor constraintEqual:_segmentedControl.bottomAnchor];

Как я могу это сделать?

Ответы [ 2 ]

3 голосов
/ 01 октября 2019

Вы должны быть в состоянии сделать

[buttonBar.topAnchor constraintEqualToAnchor:_segmentedControl.bottomAnchor].active = YES;

Документы Apple, как правило, хорошее место для начала:

https://developer.apple.com/documentation/uikit/nslayoutanchor?language=objc

В ответ на ваш комментарий о множителях сновачитать документы. Например, прокручивая вниз, мы видим:

Примечание:

Вы никогда не используете класс NSLayoutAnchor напрямую. Вместо этого используйте один из его подклассов в зависимости от типа ограничения, которое вы хотите создать.
- Используйте NSLayoutXAxisAnchor для создания горизонтальных ограничений.
- Используйте NSLayoutYAxisAnchor для создания вертикальных ограничений.
- Используйте NSLayoutDimension для создания ограниченийвлияющие на высоту или ширину видаДаже если вы не хотите ссылаться на документы каждый раз, автозаполнение - ваш друг. Просто начните набирать что-то вроде [self.widthAnchor constraint и посмотрите, что получится

2 голосов
/ 01 октября 2019

Я не знаю, как поставить .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;
...